Bonjour,
Grace à des sources proposées par la FAQ Developpez.com j'ai pu récupérer la liste des Handles des applications actives sous Windows.
Comment trouver le nom de l'application à partir de son Handle ?
Merci à tous
Bonjour,
Grace à des sources proposées par la FAQ Developpez.com j'ai pu récupérer la liste des Handles des applications actives sous Windows.
Comment trouver le nom de l'application à partir de son Handle ?
Merci à tous
Salut
Si par le nom de l'application tu entends le nom de l'exécutable, je te propose cette fonction:
Si mes souvenirs sont bons, j'avais du récupérer cette fonction chez Phildels.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 uses TlHelp32; function GetProcessNameFromHandle(Handle:HWND):string; var Pid: DWord; SnapShot: HWND; Module: TModuleEntry32; begin Result := ''; if not IsWindow(Handle) then exit; GetWindowThreadProcessId(Handle, @Pid); // récupere le pid Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Pid); // creer un snapshot sur le pid try if Snapshot<>-1 then begin Module.dwSize := SizeOf(TModuleEntry32); if Module32First(Snapshot,Module) then result:=Module.szExePath; // recupere l'exe path end; finally CloseHandle(Snapshot); end; end;
@+ Claudius
Voici le code proposé par la FAQ
Si je libère la ligne placée en remarque je génère l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall; var dwProcessId: DWORD; begin if lParam <> 0 then begin GetWindowThreadProcessId(hwnd, dwProcessId); with PFindWindowsStruct(lParam)^ do if dwProcessID = ProcessID then HandleList.Add(Pointer(hwnd)); result:= true; end else result:= false; end; procedure FindProcessWindows(ProcessID: Integer; Handles: TList); var findWindowsStruct: TFindWindowsStruct; begin findWindowsStruct.ProcessID:= ProcessID; findWindowsStruct.HandleList:= Handles; EnumWindows(@EnumWindowsProc, Integer(@findWindowsStruct)); end; procedure TForm1.FormShow(Sender: TObject); var handles: TList; i: Integer; begin Caption:= Format('Application : %d , Fenêtre courante : %d', [Application.Handle, Handle]); handles:= TList.Create; Try FindProcessWindows(GetCurrentProcessID, handles); memo1.lines.Clear; for i:= 0 to handles.Count - 1 do // Memo1.Lines.Add(IntToStr(Integer(Handles[i]))+':'+GetProcessNameFromHandle(Handles[i])); Memo1.Lines.Add(IntToStr(Integer(Handles[i]))); Finally handles.Free; End; ListerModules(Listbox1); end;
E2010 Types incompatibles : HWND et Pointer
Comment y remédier ?
Re,
Essaye d'adapter ce code qui est fonctionnel:
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 var Form1: TForm1; function EnumWindowsCallback(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; implementation {$R *.DFM} uses TlHelp32; //------------------------------------------------------------------------------ function GetProcessNameFromHandle(Handle: HWND):string; var Pid, SnapShot: Cardinal; Module: TModuleEntry32; begin Result := ''; if not IsWindow(Handle) then exit; GetWindowThreadProcessId(Handle, @Pid); // récupere le pid Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Pid); // creer un snapshot sur le pid try if Snapshot > 0 then begin Module.dwSize := SizeOf(TModuleEntry32); if Module32First(Snapshot,Module) then result:=Module.szExePath; // recupere l'exe path end; finally CloseHandle(Snapshot); end; end; //------------------------------------------------------------------------------ function EnumWindowsCallback(hWnd: HWND; lParam: LPARAM): BOOL; begin Form1.Memo1.Lines.Add('Handle: ' + IntToStr(hWnd) + ' Exécutable : '+GetProcessNameFromHandle(hWnd)); result := True; end; //------------------------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Clear; EnumWindows(@EnumWindowsCallback, 0); end;
Cela fonctionne très bien, même trop bien.
Il trouve 349 Handles ! Pas moins !
Tous les exe lancés par Windows avec plusieurs Handles pour un même exe...
Rien que pour InternetExplorer j'ai noté 8 handles ! (je n'ai que 2 instances ouvertes) Pour RadStudio 4 ou 5 handles (1 instance) et pour l'exécutable compilé et lancé 2 handles (1 instance) !!!
J'ai donc la réponse à ma question. Mille merci...
Mais comment trouver le bon Handle ? Mon problème est de faire afficher la fenêtre ouverte par un executable spécifique lancé précedemment à mon application devant celle de mon application qui obligatoirement se trove plein écran.
Vois-tu par quel moyen ?
Partager