PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Application mono-instance
Application mono-instance
Iniciado por ejacob, 19,nov. 2004 10:50 - 11 respuestas
Publicado el 19,noviembre 2004 - 10:50
Bonjour à tous,

Je souhaite créer une application de type mono-instance cad que si elle tourne déjà sur un poste, tout lancement de cette appli rebascule l'instance déjà lancée en avant plan.

Cette possibilité en générant un exécutable ne me convient car elle se contente d'afficher un message d'erreur si l'appli est lancée plusieurs fois.

Mon problème vient de l'API Windows GetWindow.

Voici le bout de code me posant un problème :

PROCEDURE GetPreviousWindow()
ResAPI est un entier
NbInstance est un réel

NbInstance = ExeLancé("C:\Mes Projets\Mon_Projet\Exe\MonoInstance.exe")

SI NbInstance > 0 ALORS
ResAPI = AppelDLL32("user32", "GetWindow" , NbInstance, 3)
RENVOYER ResAPI
SINON
ResAPI = 0
RENVOYER ResAPI
FIN

C'est l'appel de l'API GetWindows qui me retourne une erreur, m'indiquant que le nombre de paramètres passés n'est pas cohérent. Pourtant cela a l'air d'être bon.

Je remercie d'avance tout personne qui pourra me permettre de sortir de cette impasse.

Cordialement,

Erwan JACOB.
Publicado el 19,noviembre 2004 - 11:38
Salut

J'ai déjà utilisé la méthode suivante, qui est simple à mettre en oeuvre. A l'ouverture du projet, je bloque un fichier avec HBloqueFichier. Si le blocage marche, je suis seul. Si le blocage échoue, je quitte l'application.

Ciao
http://wdgotcha.atspace.com
Publicado el 19,noviembre 2004 - 12:07
Je n'ai pas de base de données et cela n'a rien à voir avec ce sujet.
Il faut imaginer une appli qui est en cours d'exécution.
Si je reclique sur l'exécutable je dois relancer en premier plan la même instance.
Pour ce faire, il faut utiliser les API Windows (GetWindow notamment). Cela marche tres bien en VB6 mais je n'arrive pas à le réaliser sous Windev.
Publicado el 19,noviembre 2004 - 13:21
NbInstance est un entier //pas un reel
--
-----------
Petit Malin


"Erwan JACOB" <ejacob@altern.org> a écrit dans le message de news:
419da9f2$1@news.pcsoft.fr...

Bonjour à tous,

Je souhaite créer une application de type mono-instance cad que si elle
tourne déjà sur un poste, tout lancement de cette appli rebascule
l'instance déjà lancée en avant plan.

Cette possibilité en générant un exécutable ne me convient car elle se
contente d'afficher un message d'erreur si l'appli est lancée plusieurs
fois.

Mon problème vient de l'API Windows GetWindow.

Voici le bout de code me posant un problème :

PROCEDURE GetPreviousWindow()
ResAPI est un entier
NbInstance est un réel

NbInstance = ExeLancé("C:\Mes Projets\Mon_Projet\Exe\MonoInstance.exe")

SI NbInstance > 0 ALORS
ResAPI = AppelDLL32("user32", "GetWindow" , NbInstance, 3)
RENVOYER ResAPI
SINON
ResAPI = 0
RENVOYER ResAPI
FIN

C'est l'appel de l'API GetWindows qui me retourne une erreur, m'indiquant
que le nombre de paramètres passés n'est pas cohérent. Pourtant cela a
l'air d'être bon.

Je remercie d'avance tout personne qui pourra me permettre de sortir de
cette impasse.

Cordialement,

Erwan JACOB.
Publicado el 19,noviembre 2004 - 14:22
"Erwan JACOB" <ejacob@altern.org> écrivait news:419da9f2$1
@news.pcsoft.fr:

ResAPI est un entier
NbInstance est un réel
ResAPI = AppelDLL32("user32", "GetWindow" , NbInstance, 3)


Salut,


Pour la fcontion "GetWindow", WDAPI donne :

RetourFonction est un entier // Type C :HWND
hWnd est un entier // Type C :HWND
uCmd est un entier sans signe // Type C :UINT

RetourFonction=API("USER32","GetWindow",hWnd,uCmd)


Les types des variables sont primoridiaux avec les APIs !!


Mais au dela de cela, cela ne fonctionnera pas !!

Cette fonction ne fait pas cela, regarde la doc sur la MSDN

http://msdn.microsoft.com/library/default.asp…-
us/winui/winui/windowsuserinterface/windowing/windows/windowreference/win
dowfunctions/getwindow.asp


--
En esperant t'avoir aidé.
ted
Publicado el 19,noviembre 2004 - 17:23
Alors moi j'aurais fait comme ça :

executable est une chaîne ASCIIZ sur 255 //par exemple
executable = "C:\windows\system32\notepad.exe"
SI ExeLancé(executable) > 0 ALORS
SI AppelDLL32("user32", "EnumWindows", &VerifierNom, &executable) <> 0
ALORS Trace("ok")
FIN

PROCEDURE VerifierNom(hwnd, lParam)
buffer est une chaîne ASCIIZ sur 255
ChaineAComparer est une chaîne ASCIIZ sur 255
Transfert(&ChaineAComparer, lParam, 255)
nbch est un entier
nbch = API("user32", "GetWindowModuleFileName", hwnd, &buffer, 255)
SI nbch > 0 ALORS
SI Gauche(buffer, nbch) = Gauche(ChaineAComparer, nbch) ALORS
SI PAS API("user32", "SetForegroundWindow", hwnd) ALORS
Erreur("ça bugue")
FIN
RENVOYER Faux
FIN
FIN
RENVOYER Vrai

Le seul truc qui coince c'est que c'te saleté de GetWindowModuleFileName me
renvoie 0 caractère pour toutes les fenêtres qui ne sont pas des filles de
la fenêtre qui le lance (apparement), ce qui est bien sur le cas de mon
notepad.exe
Si quelqu'un sait pourquoi, moi je sèche !!!

--

---------
Petit Malin qui fait pas le malin sur ce coup là


"Erwan JACOB" <ejacob@altern.org> a écrit dans le message de news:
419da9f2$1@news.pcsoft.fr...

Bonjour à tous,

Je souhaite créer une application de type mono-instance cad que si elle
tourne déjà sur un poste, tout lancement de cette appli rebascule
l'instance déjà lancée en avant plan.

Cette possibilité en générant un exécutable ne me convient car elle se
contente d'afficher un message d'erreur si l'appli est lancée plusieurs
fois.

Mon problème vient de l'API Windows GetWindow.

Voici le bout de code me posant un problème :

PROCEDURE GetPreviousWindow()
ResAPI est un entier
NbInstance est un réel

NbInstance = ExeLancé("C:\Mes Projets\Mon_Projet\Exe\MonoInstance.exe")

SI NbInstance > 0 ALORS
ResAPI = AppelDLL32("user32", "GetWindow" , NbInstance, 3)
RENVOYER ResAPI
SINON
ResAPI = 0
RENVOYER ResAPI
FIN

C'est l'appel de l'API GetWindows qui me retourne une erreur, m'indiquant
que le nombre de paramètres passés n'est pas cohérent. Pourtant cela a
l'air d'être bon.

Je remercie d'avance tout personne qui pourra me permettre de sortir de
cette impasse.

Cordialement,

Erwan JACOB.
Publicado el 19,noviembre 2004 - 17:37
j'utilise un code que l'on m'a filé sur ce forum (je ne sais plus qui...).

# code du projet :

TitreFenetreApplication est une chaîne= "Mon Appli"
HandleFenêtre est un entier

SI ExeLancé(ExeInfo(exeNom))>1 ALORS
// Le programme est déjà lancé
HandleFenêtre = SysFenHandle(TitreFenetreApplication)
SI SysHandleValide(HandleFenêtre) ALORS SysDonneFocus(HandleFenêtre)
FinProgramme()
SINON
// OK l'application n'est pas lancée
FIN

tu compiles une exe multiinstance et le tour est joué...


A+
Adrien.
www.codewindev.fr.st
Publicado el 19,noviembre 2004 - 17:50
Comme c'est toujours juste après un post qu'on trouve une info,
http://support.microsoft.com/… :
INFO: GetWindowModuleFileName & GetModuleFileName Work Only with the Calling
Process

Il est conseillé d'utiliser plutot GetModuleFileNameEx qui se trouve dans
psapi.dll
Donc je remplace mon appel à GetWindowModuleFileName par
nbch = API("psapi", "GetModuleFileNameEx", hwnd, Null, &buffer, 255)
mais là Windev me dit que j'ai fait une
Erreur à la ligne 6 du traitement Procédure locale VerifierNom.
Vous avez appelé la fonction API.
La fonction 'GetModuleFileNameEx' n'a pas été trouvée dans la DLL
psapi
Alors que j'ai un XP donc ca devrait marcher.
Donc toujours pas de quoi faire le malin. :(

--

---------
Petit Malin
Publicado el 19,noviembre 2004 - 18:51
mouais c ce que j'essayais de faire via les API :)
ça m'apprendra à pas connaitre les fonctions Windev

--

---------
Pas Malin

"Adrien" <adrien.titou@ifrance.com> a écrit dans le message de news:
419e0973@news.pcsoft.fr...



j'utilise un code que l'on m'a filé sur ce forum (je ne sais plus qui...).

# code du projet :

TitreFenetreApplication est une chaîne= "Mon Appli"
HandleFenêtre est un entier

SI ExeLancé(ExeInfo(exeNom))>1 ALORS
// Le programme est déjà lancé
HandleFenêtre = SysFenHandle(TitreFenetreApplication)
SI SysHandleValide(HandleFenêtre) ALORS SysDonneFocus(HandleFenêtre)
FinProgramme()
SINON
// OK l'application n'est pas lancée
FIN

tu compiles une exe multiinstance et le tour est joué...


A+
Adrien.
www.codewindev.fr.st
Publicado el 19,noviembre 2004 - 18:53
mais n'empêche, dans l'hypothèse, on n'avait pas le titre de la fenêtre mais
le nom de l'exécutable.
si le titre de la fenetre est variable,comment on fait ?

--

---------
Petit Malin

"Adrien" <adrien.titou@ifrance.com> a écrit dans le message de news:
419e0973@news.pcsoft.fr...



j'utilise un code que l'on m'a filé sur ce forum (je ne sais plus qui...).

# code du projet :

TitreFenetreApplication est une chaîne= "Mon Appli"
HandleFenêtre est un entier

SI ExeLancé(ExeInfo(exeNom))>1 ALORS
// Le programme est déjà lancé
HandleFenêtre = SysFenHandle(TitreFenetreApplication)
SI SysHandleValide(HandleFenêtre) ALORS SysDonneFocus(HandleFenêtre)
FinProgramme()
SINON
// OK l'application n'est pas lancée
FIN

tu compiles une exe multiinstance et le tour est joué...


A+
Adrien.
www.codewindev.fr.st
Publicado el 19,noviembre 2004 - 19:36
Bon c'était GetModuleFileNameExA (allez savoir pourquoi !)
Mais je n'arrive toujours pas à lafaire marcher.

ça intéresse tjs quelqu'un ou j'arrete de me répondre a moi meme sur cesujet
--

---------
Petit Malin

"Petit Malin" <nospam@9online.fr> a écrit dans le message de news:
419e0d46@news.pcsoft.fr...

Comme c'est toujours juste après un post qu'on trouve une info,
http://support.microsoft.com/… :
INFO: GetWindowModuleFileName & GetModuleFileName Work Only with the
Calling
Process

Il est conseillé d'utiliser plutot GetModuleFileNameEx qui se trouve dans
psapi.dll
Donc je remplace mon appel à GetWindowModuleFileName par
nbch = API("psapi", "GetModuleFileNameEx", hwnd, Null, &buffer, 255)
mais là Windev me dit que j'ai fait une
Erreur à la ligne 6 du traitement Procédure locale VerifierNom.
Vous avez appelé la fonction API.
La fonction 'GetModuleFileNameEx' n'a pas été trouvée dans la DLL
psapi
Alors que j'ai un XP donc ca devrait marcher.
Donc toujours pas de quoi faire le malin. :(

--

---------
Petit Malin

Publicado el 24,noviembre 2004 - 13:11
Désolé pour le retard de réponse.
Je te remercie beaucoup, ca marche nikel!

Erwan