Uchwyt okna na podstawie ProcID

Uchwyt okna na podstawie ProcID
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzień dobry,

otóż mam mały problem od paru dni próbuje odczytać tytuł okna danej aplikacji znając jej ProcID.
Problem jest tego typu że nie do końca wiem jak uzyskać uchwyt okna, uchwyt procesu otrzymuje:

Kopiuj
...
vHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
... 

ale po przez uchwyt procesu nie mogę odczytać nazwy jej okna ;/

Kopiuj
... 
GetWindowText(vHandle, Buffer, SizeOf(Buffer));
...

Powyższa funkcja działa jeżeli podam uchwyt ona, np. po przez funkcję

Kopiuj
...
vHandle := GetForegroundWindow;
... 

Pytanie jak uzyskać poprawny uchwyt okna na podstawie ProcID ?

Z góry dzięki za odpowiedź.

olesio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
  • Postów: 4191
1

Ech. Nie myślisz kompletnie co robisz!!! Przecież funkcja pobierająca tekst z kontrolek/okien wymaga uchwytu OKNA, a nie procesu. Natomiast OpenProces ustanawia uchwyt, ale w rozumieniu typu THandle (mimo że w Delphi typy HWND i THandle są takiego samego rozmiaru i przedziału wielkości, to jednak należy je rozróżniać). OpenProcess służy do uzyskania uchwtu do operacji na prociesie. Jak na przykład czytanie/zapis po/do pamięci, ubicie procesu i tak dalej. Natomiast co do pytania, jak uzyskać HWND z PID. Polecam kod poniższego modułu: Który kiedyś sobie napisałem w WinAPI.

Kopiuj
unit get_hwnd_from_pid;

interface

uses
  Windows;

function PidToHandle(SourcePid : DWORD) : HWND;

implementation

type
  TEnumClass = class
  private
    TempH : HWND;
    DestPid : DWORD;
    function SearchForHandle(SourcePid : DWORD) : HWND;
  end;

function EnumWindowsProc(AHandle : HWND; ALParam : LParam) : LongBool; stdcall;
var
  Pid : DWORD;
  EC : TEnumClass;
begin
  Result := True;
  EC := TEnumClass(ALParam);
  GetWindowThreadProcessId(AHandle, Pid);
  if Pid = EC.DestPid then
  begin
    if (GetWindowLong(AHandle, GWL_HWNDPARENT) = 0) and (IsWindowVisible(AHandle) or IsIconic(AHandle)) then
    begin
      EC.TempH := AHandle;
      Result := False;
    end;
  end;
end;

function TEnumClass.SearchForHandle(SourcePid : DWORD) : HWND;
begin
  DestPid := SourcePid;
  EnumWindows(@EnumWindowsProc, LParam(Self));
  Result := TempH;
end;

function PidToHandle(SourcePid : DWORD) : HWND;
var
  EC : TEnumClass;
begin
  Result := 0;
  if SourcePid > 0 then
  begin
    EC := TEnumClass.Create;
    EC.DestPid := SourcePid;
    Result := EC.SearchForHandle(SourcePid);
    EC.Free;
  end;
end;

end.
  • Rejestracja: dni
  • Ostatnio: dni
0

olesio dzięki wielkie ! Działa.

Na marginesie dawałem taki przykład z tym uchwytem do procesu, wszędzie gdzie nie szukałem wywalało przykład z uchwytem do procesu zamiast do okna.

Jeszcze raz dzięki, naprawdę bardzo mi się przyda twój kod.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
olesio
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
  • Postów: 4191
0

Skoro kod się przydał to pozwoliłem sobie zaznaczyć go jako rozwiązanie.

@_13th_Dragon: jeśli dobrze zrozumiałem chodzi o uzyskanie uchytu na podstawie PIDu. A nie odwrotnie. A tylko wtedy można było by zastosować od razu tę funkcję, którą podałeś. Zresztą i tak jej użyłem w swoim kodzie. I według mnie jedynym sposobem na osiągnięcie tego, o co pytał autor wątku, jest enumeracja. Zresztą link jaki podałeś pokazuje kod, ale nie w Delphi. Działa on jednak na podobnej zasadzie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.