PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Donner la mains à une autre application
Donner la mains à une autre application
Débuté par Romuald Besset, 05 mai 2009 14:05 - 3 réponses
Posté le 05 mai 2009 - 14:05
Bonjour,
Je dois basculer entre 2 projets WinDev via une touche de fonction.
Je gère l'évènement de la touche dans chaque projet.

Là, je sais
-vérifier si mon autre exécutable est lancé (ExeLancé),
- le lancer (LanceAppli)
- récupère les PID des process en cours (ExeListeProcessus)

- Trouver le handle d'une fenêtre dont j'ai le nom (SysFenHandle)
- Donner le focus à une fenêtre dont j'ai le Handle(SysDonneFocus)

Il me manque une étape et c'est l'objet de ma question : Comment trouver le nom de la fenêtre en cours (ce nom change) dans un programme dont on a le PID,le nom etc ?

mes recherches ne m'ont mené nulle part de concluant.

Bien cordialement,
R&B
Posté le 05 mai 2009 - 16:23
une variable globale au projet qui stocke le nom de la fenêtre en cours.
Et ceci dans chaque projet.
Sinon un table hf avec 1 rubrique Login connecté + 1 Rub le nom de la fenêtre en cours.

Bon dev
Posté le 05 mai 2009 - 17:32
je suis tombé sur quelquechose qui approche ma solution et que je vais creuser :
http://forum.pcsoft.fr/thread.awp…

L'idée de stocker la fenêtre en cours est toutefois à l'étude.

Bien cordialement
R&B
Posté le 06 mai 2009 - 11:22
Un mélange de ce que j'ai pu trouver en cherchant "EnumWindows" et des fonctions WinDev précitées m'a permis de sortir de ce mauvais pas.:

// procédure énènement de touche qui gène le passage à l'autre projet
Procedure Retour_VLB(wMessage, wParam, lParam)
SI wParam = VK_F2 ALORS
cExeCherché est une chaîne
cLProcess est une chaîne
cProcess est une chaîne
cExe est une chaîne
nPid est un entier
cExeCherché = "MONEXE.exe"
nNbLancé est un entier
nNbLancé = ExeLancé(cExeCherché)
SI nNbLancé>0 ALORS
// récupère le Pid de l'exe
cLProcess = ExeListeProcessus(exeNomLong,exePID)
SI Position(cLProcess,cExeCherché)<>0 ALORS
POUR TOUTE CHAINE cProcess DE cLProcess SEPAREE PAR RC
cExe = ExtraitChaîne(cProcess,1)
SI Position(cExe,cExeCherché) ALORS
nPid = Val(ExtraitChaîne(cProcess,2))
SORTIR
FIN
FIN
FIN
SI nPid=0 ALORS
// au cas ou !
ExeTermine("MONEXE.exe")
nPid = LanceAppli("MONEXE.exe",exeActif,exeNonBloquant)
SINON
gnPidExe = nPid
// On lance l'énumération des fenetres actives et récupère celles de l'exe
ListeHwndWindows est une chaîne ASCIIZ sur 513 = ""
API("user32", "EnumWindows", &EnumWindowsProc &ListeHwndWindows)
// passe sur chaque fenetre et tente de lui donner la main, la fenetre active prendra le focus.
cFenêtre est une chaîne
POUR TOUTE CHAINE cFenêtre DE ListeHwndWindows SEPAREE PAR CRLF
gnHwnd=Val(cFenêtre)
SI SysHandleValide(gnHwnd) ALORS SysDonneFocus(gnHwnd)
FIN

FIN
SINON
// l'exe n'est pas lancé
nPid = LanceAppli("MONEXE.exe",exeActif,exeNonBloquant)
FIN
FIN
FIN

// la callback qui liste les fenetre correspondante au PID (stocké en globale)
FUNCTION EnumWindowsProc(lgHwnd est un entier, pAdresse est un entier )
// récupère le processus parent de la fenêtre
processId est un entier
AppelDLL32("USER32","GetWindowThreadProcessId",lgHwnd, &processId)
// s'agit-il de l'applicaiton que l'on cherche (son PID est dans une globale) ?
SI processId = gnPidExe ALORS
// oui : complete la liste
HwndWindows est une chaîne ASCIIZ sur 513
TitreWindows est une chaîne ASCIIZ sur 513
bVisible est un booléen
// lit le titre de la fenêtre
API( "USER32", "GetWindowTextA", lgHwnd, &TitreWindows, 512)
// lit si la fenêtre est visible
bVisible = API("USER32","IsWindowVisible",lgHwnd)
// titre non vide et fenetre visible => récupère le handle dans la liste
SI SansEspace(TitreWindows) <> "" ET bVisible = Vrai ALORS
// Envois dans la liste uniquement les handle de fenetre
// active et correpondant au PID
Transfert(&HwndWindows,pAdresse, 513)
HwndWindows = SansEspace(HwndWindows)
SI HwndWindows <> "" ALORS HwndWindows += CRLF
HwndWindows += lgHwnd
Transfert(pAdresse,&HwndWindows,513)
END
END
RENVOYER True