Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FensterText per ProcessID bekommen? (https://www.delphipraxis.net/106538-fenstertext-per-processid-bekommen.html)

sk0r 12. Jan 2008 14:31


FensterText per ProcessID bekommen?
 
Hi,

kurze und schnelle Frage: WIe kann ich per WinAPI den
Text des Fensters einer Anwendung bekommen deren ProcessID
ich habe? Ich finde bei MSDN leider keine API.

Danke im Vorraus für Hilfe

MfG: sk0r

DGL-luke 12. Jan 2008 14:33

Re: FensterText per ProcessID bekommen?
 
von der pid solltest du irgendwie zum hauptfenster kommen, und das handle des hauptfensters kann in GetWindowText(Len) packen.

Wotan89 12. Jan 2008 14:36

Re: FensterText per ProcessID bekommen?
 
http://msdn2.microsoft.com/en-us/library/ms633520(VS.85).aspx

sk0r 12. Jan 2008 14:38

Re: FensterText per ProcessID bekommen?
 
GetWindowText() habe ich schon ausprobiert. MEin Ziel ist es,
dass eine injizierte DLL den Fenstertext des Zielprogrammes zu bekommen.

Code:
procedure TForm1.FormCreate(Sender: TObject);
var
  myBuf: array[0..250] of Char;
begin
  setlasterror(ERROR_SUCCESS);
  GetWindowText(0, myBuf, sizeof(myBuf));
  showmessage(myBuf);
  showmessage(syserrormessage(getlasterror));
end;
Die Eigene Anwendung hat doch immer die Nummer 0, oder?

SirThornberry 12. Jan 2008 14:46

Re: FensterText per ProcessID bekommen?
 
nein, auch die eigene Anwendung hat nicht die 0

sk0r 12. Jan 2008 14:49

Re: FensterText per ProcessID bekommen?
 
Also GetWindowText kann nicht einfach so funktionieren, da es ja
selbst ein Handle als Parameter benötigt. Aber wie komme ich da drann? :/

DGL-luke 12. Jan 2008 15:14

Re: FensterText per ProcessID bekommen?
 
ähm, getcurrentprocess oder so ähnlich sollte dir die procid geben... und dann weiter wie in meinem ersten post ^^

sk0r 12. Jan 2008 15:15

Re: FensterText per ProcessID bekommen?
 
schon klar, aber wie komme ich denn an das fenster handle?^^

DGL-luke 12. Jan 2008 15:18

Re: FensterText per ProcessID bekommen?
 
aus der google-suche entnommen:

Zitat:

Enumerate all windows (EnumWindows()), get process ID for each one (GetWindowThreadProcessId()). Compare it with process ID you've got and if the same you found your window.

Olli 12. Jan 2008 16:29

Re: FensterText per ProcessID bekommen?
 
Die meisten Prozeße werden mehrere Fenster haben. Schlimmer noch, dank der Tatsache, daß es sowas wie ein "Hauptfenster" nicht gibt (ein Prozeß kann da auch mehrere mit dem entsprechenden Fensterstil haben), mußt du wohl, wie schon erwähnt durch alle Fenster gehen und ermitteln ob das gewünschte dabei ist. Da wird wohl nur eine Kombination aus Text, Klasse und Stil (o.ä.) einen Erfolg bringen. Wenn du nur den Text ermittelst, kann das schiefgehen.

bitsetter 12. Jan 2008 19:34

Re: FensterText per ProcessID bekommen?
 
Hi,

mit EnumThreadWindows müsste es IMHO auch gehen, die Fenster in der Liste müsstest du eventuell nochmal filtern.
Mal schnell zusammengetippt:
Delphi-Quellcode:
uses TLHelp32, Contnrs;

type
  TWndItem = class(TObject)
    Wnd: HWND;
end;

function EnumThreadWndProc(Wnd: HWND; WndList: TObjectList): BOOL; stdcall;
var
  WndItem: TWndItem;
begin
  WndItem:= TWndItem.Create;
  WndItem.Wnd:= Wnd;
  WndList.Add(WndItem);
  Result:= true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  WndList: TObjectList;
  Thread32: TThreadEntry32;
  hThreadSnap: THandle;
  ProcId: DWord;
  i: integer;
  myBuf: array[0..250] of Char;
begin
  WndList:= TObjectList.Create;
  try
    ProcId := ...;//GetCurrentProcessId();
    hThreadSnap := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, ProcId);
    if (hThreadSnap > 0) and (hThreadSnap <> INVALID_HANDLE_VALUE) then
      try
        ZeroMemory(@Thread32, SizeOf(TThreadEntry32));
        Thread32.dwSize := SizeOf(TThreadEntry32);
        if Thread32First(hThreadSnap, Thread32) then
          repeat
            if ProcId = Thread32.th32OwnerProcessID then
              EnumThreadWindows(Thread32.th32ThreadID, @EnumThreadWndProc, DWord(WndList));
          until not Thread32Next(hThreadSnap, Thread32);
      finally
        CloseHandle(hThreadSnap);
      end;

    for i:= 0 to Pred(WndList.Count) do
    begin
      if Windows.IsWindowVisible(TWndItem(WndList.Items[i]).Wnd) then
      begin
        GetWindowText(TWndItem(WndList.Items[i]).Wnd, myBuf, sizeof(myBuf));
        ListBox1.Items.Add(myBuf);
      end;
    end;

  finally
    WndList.Free;
  end;
end;

Luckie 12. Jan 2008 22:19

Re: FensterText per ProcessID bekommen?
 
EnumThreadWindows muss dann aber auch für alle Threads des Prozesses ausgeführt werden!

bitsetter 13. Jan 2008 00:41

Re: FensterText per ProcessID bekommen?
 
Dass wird doch in der Schleife gemacht oder nicht?
In den meisten Fällen wird es jedenfalls ausreichen.

mschaefer 9. Mai 2009 22:33

Re: FensterText per ProcessID bekommen?
 
oder nicht 'EnumThreadWndProc' müßte mehrfach aufgerufen werden...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz