Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Pour récupérer le handle de la fenêtre de l'exécutable lancé
NewList Liste_Fenetres()
Structure PROCESSENTRY32
dwSize.l
cntUsage.l
th32ProcessID.l
*th32DefaultHeapID.l
th32ModuleID.l
cntThreads.l
th32ParentProcessID.l
pcPriClassBase.l
dwFlags.l
szExeFile.b [260]
EndStructure
Procedure.l RunProgramEx(NomFichier$, Parametre$, RepertoireCourant$)
Protected WindowID.l, hWnd.l, LastWindowID.l, pid.l, Process32Search.l
ClearList(Liste_Fenetres())
; Fenêtre au premier plan
WindowID = GetForegroundWindow_()
; On liste les fenêtres ouvertes
hWnd.l = FindWindow_(0, 0)
While hWnd <> 0
If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE
AddElement(Liste_Fenetres())
Liste_Fenetres() = hWnd
EndIf
hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
Wend
; On lance le programme
RunProgram(NomFichier$, Parametre$, RepertoireCourant$)
NomFichier$ = LCase(GetFilePart(NomFichier$))
; On cherche l'ID du la fenêtre créée
Repeat
Delay(50)
LastWindowID = GetForegroundWindow_()
If LastWindowID <> 0 And LastWindowID <> WindowID
; On compare avec la liste des fenêtres qui étaient ouvertes
ResetList(Liste_Fenetres())
While NextElement(Liste_Fenetres())
If LastWindowID = Liste_Fenetres()
WindowID = LastWindowID
EndIf
Wend
If LastWindowID <> WindowID
; On vérifie le nom du programme dont on vient de récupérer le handle
GetWindowThreadProcessId_(LastWindowID, @pid)
If OpenLibrary(9000, "kernel32.dll")
Process32Search = CallFunction(9000, "CreateToolhelp32Snapshot", 2, 0)
If Process32Search
DefType.PROCESSENTRY32 Proc32
Proc32\dwSize = SizeOf(PROCESSENTRY32)
If CallFunction(9000, "Process32First", Process32Search, @Proc32)
Repeat
If pid = Proc32\th32ProcessID And LCase(GetFilePart(PeekS(@Proc32\szExeFile))) <> NomFichier$
WindowID = LastWindowID
EndIf
Until CallFunction(9000, "Process32Next", Process32Search, @Proc32) = 0
EndIf
CloseHandle_(Process32Search)
EndIf
CloseLibrary(9000)
EndIf
EndIf
EndIf
Until LastWindowID <> 0 And LastWindowID <> WindowID
ProcedureReturn LastWindowID
EndProcedure
ID = RunProgramEx("Explorer.exe", "", "")
Debug "ID du programme lancé = " + Str(ID)
Texte.s = "Chopée"
SetWindowText_(ID, @Texte)