Jak pobrać tytuł okna procesu znając jego ID?

0

W jaki sposób pobrać tytuł okienka procesu, gdy mam jego Process ID?

0

Po to jest to forum i dział Newbie, żeby odsyłać do Google? A założmy, że nie znam języka angielskiego?

1

To masz problem;

Ten wątek i poruszany w nim problem wcale nie nadaje się do tej kategorii, bo nie dotyczy podstaw języka; Poza tym, forum nie służy do wrzucania problemów i oczekiwania na gotowce; Tak więc zabierz się za czytanie pierwszych wyników z podanego linka i testowaniu podanych w tych artykułach kodów; Albo czekaj na kogoś, kto nauczy się angielskiego za Ciebie, poczyta artykuły za Ciebie, potestuje za Ciebie przykładowe kody i poda tutaj rozwiązanie;

PS: W pierwszych trzech wynikach znajdują się gotowce.

0

Jestem ci niezmiernie wdzięczny mój wielki moderatorze za twoją cenną wypowiedź. Nie oczekuje gotowca i nie traktuj mnie jak pierwszego lepszego trolla, który czeka na kod, żeby sobie go wkleić. Dobrze, że nie zakładam konta na tym forum, bo widzę że nie warto. Ciekaw jestem ile postów z tych twoich 4 tysięcy ma jakąkolwiek wartość merytoryczną.

Równie dobrze możesz każdemu odpisać na każdy temat w tym dziale, odesłać do Google i pisać że ma problem, jak czegoś nie potrafi znaleźć. Jaki cel ma to forum, a przede wszystkim dział Newbie? Chyba żaden. Nie pozdrawiam.

4

Na co Ty liczysz? Poszukałem za Ciebie rozwiązania, bo wielki Pan nie umie korzystać z wyszukiwarki; Link który podałem wskazuje artykuły, w których znajdują się gotowe kody, spełniające wymagania - proste, krótkie i zrozumiałe; Mam marnować czas na przeklejanie treści z innych stron, bo Ty łaskawie nie poczytasz sam? Angielskiego nie znasz? Widocznie tłumacza Google też nie, a ten spokojnie wystarczy, aby zrozumieć wszystko co w tych artach napisane;

Jak Ci się nie chce ruszyć czterech liter i samemu coś zrobić to nie nazywaj odpowiedzi bezwartościowymi;


PS: Nie zabieraj się za pisanie rzeczy wymagających większej wiedzy (również z zakresu Win32 API), jeśli masz poważne braki w podstawach języka; A to można wywnioskować z Twoich poprzednich dwóch wątków; Najpierw dobrze poznaj język, a dopiero później baw się w hakowanie.

2

@furious programming to akurat nie jest takie proste jak się może wydawać. Bez odpowiedniej znajomości windows api raczej nie da się tego prosto zrobić. Ja mam gotowy kod, który dla danego PID przegląda wszystkie "otwarte" okna w poszukiwaniu odpowiedniego captiona. Gdyż to okno z tym konkretnym captionem potrzebowałem zakotwiczyć w mojej aplikacji.
Drogi pytaczu, ponieważ tak jak wspomniałem mam gotowy kod na dzień dobry podpowiem, z czego skorzystać abyś nauczył się sam czegoś nowego:
Tak jak wspomniał @furious programming musisz pobrać uchwyt (handle) interesującego Cię okna z twojego PID aby tego dokonać możesz użyć np mojej funkcji:

function GetHWndByPID(const hPID: THandle): THandle;
  type
    PEnumInfo = ^TEnumInfo;
    TEnumInfo = record
    ProcessID: DWORD;
    HWND: THandle;
  end;

  function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
  var
    PID: DWORD;
  begin
    GetWindowThreadProcessID(Wnd, @PID);
    Result := (PID <> EI.ProcessID) or
            (not IsWindowVisible(WND)) or
            (not IsWindowEnabled(WND));

    if not Result then
      EI.HWND := WND; //break on return FALSE
  end;

  function FindMainWindow(PID: DWORD): DWORD;
  var
    EI: TEnumInfo;
  begin
    EI.ProcessID := PID;
    EI.HWND := 0;
    EnumWindows(@EnumWindowsProc, Integer(@EI));
    Result := EI.HWND;
  end;
begin
  if hPID<>0 then
    Result:=FindMainWindow(hPID)
  else
    Result:=0;
end;

Nie jest zbyt "piękna" ale działa, a następnie używając:
https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms633494(v=vs.85).aspx
musisz sobie stworzyć procedurę, która zwróci Ci caption poszczególnych okien (bo tak jak pisałem pierwszym oknem może być splashscreen, okno logowania lub coś innego niż interesujące Cię okno).

Przy pisaniu funkcji EnumChild zalecam skorzystanie z GetClassName oraz GetWindowText obie w Delphi znajdują się w module Windows.

0

Dzięki za odpowiedź.

Udało mi się zrobić prościej. Oto rozwiązanie:

function GetWindowTitleByClass(ClassName: string): string;
var
  ProcId: Cardinal;
  Hwnd: THandle;
  Len: LongInt;
  Title: string;
begin
  GetWindowThreadProcessId(FindWindow(PChar(ClassName), nil), ProcId);
  Hwnd := GetHWndByPID(ProcId);
  Len := GetWindowTextLength(Hwnd) + 1;
  SetLength(Title, Len);
  GetWindowText(hwnd, PChar(Title), Len);
  Title := TrimRight(Title);
  Result := Title;
end;

Tzn. źle napisałem, że prościej. To jest funkcja, która wykorzystuje to co podałeś. Dzięki i pozdrawiam.

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