[delphi] Uchwyt programu znajac nazwe procesu.

0

Witam.
Przeszukuje już forum 2 dni, dość sporo było tematów na ten temat ;-)
Potrzebuję pobrać uchwyt programu(okna) znając jego nazwe procesu(np. gg.exe).
Udało uzystać mi się ID procesu ale mam problemy z konwersją go na uchwyt:

... := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE, Proces.th32ProcessID);
0

Program zwraca Uchwyty aplikacji o danej nazwie :
Funkcja GetWindowProcessName zwraca ścieżke do aplikacji do której należy okno o danym uchwycie:

program Uchwyt;

{$APPTYPE CONSOLE}



uses
  Windows, Messages, SysUtils, Variants,
  TLHelp32,Psapi;

  function  GetProcessName95(const PID: DWord): string;
var
   ToolHandle: THandle;
   Process: TProcessEntry32;
begin
   ToolHandle := CreateToolhelp32Snapshot(th32cs_SnapProcess, 0);
   if ToolHandle = Invalid_Handle_Value then RaiseLastWin32Error else try
     Process.dwSize := SizeOf(Process);
     if Process32First(ToolHandle, Process) then repeat
       if Process.th32ProcessID = PID then begin
         Result := Process.szExeFile;
         exit;
       end;
     until not Process32Next(ToolHandle, Process);
     if GetLastError <> Error_No_More_Files then RaiseLastWin32Error;
   finally
     CloseHandle(ToolHandle);
   end;
end;





  function  GetProcessNameNT(const PID: DWord): string;
var
   Process: THandle;
   Modules: array of HModule;
   Needed: DWord;
   Len: DWord;
begin
   Process := OpenProcess(Process_Query_Information or Process_VM_Read,
False, PID);
   if Process = 0 then RaiseLastWin32Error else try
     Win32Check(EnumProcessModules(Process, nil, 0, Needed));
     SetLength(Modules, Needed div SizeOf(Modules[0]));
     Win32Check(EnumProcessModules(Process, PDWord(@Modules[0]), Needed,
Needed));
     SetLength(Result, Max_Path);
     Len := GetModuleFileNameEx(Process, Modules[0], PChar(Result),
Length(Result));
     if Len = 0 then RaiseLastWin32Error else SetLength(Result, Len);
   finally
     CloseHandle(Process);
   end;
end;


function  GetWindowProcessName(const Wnd: HWnd): string;
var
   PID: DWord;
begin
   GetWindowThreadProcessID(Wnd, @PID);
   if Win32Platform = Ver_Platform_Win32_NT then
     Result := GetProcessNameNT(PID)
   else
     Result := GetProcessName95(PID);
end;

Teraz musimy przelecieć :-D wszystkie okna w poszukiwaniu uchwytów skojarzonych z GG
a ponieważ dostajemy całą ścieżkę musimy użyć ExtractFileName
Wersja 1 (dla widocznych i niewidoczych okien)

var
TestowaneOkno:THandle;
begin
TestowaneOkno:=GetTopWindow(0); // uchwyt okna górnego

  While TestowaneOkno<>0 do  // dopóki TestowaneOkno to okno
 begin
if ExtractFileName( GetWindowProcessName(TestowaneOkno))='gg.exe' then Writeln('Uchwyt okna GG to ',TestowaneOkno);

TestowaneOkno:=getWindow(TestowaneOkno, GW_HWNDNEXT) ;//Jak nie to bierzesz następnne okno

end;

readln;
end.

Wersja 2 (tylko dla widocznych okien)

var
TestowaneOkno:THandle;
begin
TestowaneOkno:=GetTopWindow(0); // uchwyt okna górnego

  While TestowaneOkno<>0 do  // dopóki TestowaneOkno to okno
 begin
if (ExtractFileName( GetWindowProcessName(TestowaneOkno))='gg.exe') and
(IsWindow(TestowaneOkno)= true)  and 
(IsWindowVisible(TestowaneOkno)=true) then Writeln('Uchwyt okna GG to ',TestowaneOkno);

TestowaneOkno:=getWindow(TestowaneOkno, GW_HWNDNEXT) ;//Jak nie to bierzesz następnne okno

end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1