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 Handle eines Fensters über die Processid? (https://www.delphipraxis.net/96547-handle-eines-fensters-ueber-die-processid.html)

gandime 26. Jul 2007 12:31


Handle eines Fensters über die Processid?
 
Hi,
ich ich glaube mein Titel beschreibt mein Problem gut ;-)
also ich habe eine Processid und hätte gerne das Handel des Fensters.

mfg
gandime

OregonGhost 26. Jul 2007 12:36

Re: Handle eines Fensters über die Processid?
 
Zitat:

Zitat von gandime
ich habe eine Processid und hätte gerne das Handel des Fensters.

Welches Fensters?

Luckie 26. Jul 2007 12:36

Re: Handle eines Fensters über die Processid?
 
Welches Fensters? Ein Prozess kann mehrere Fenster haben.

gandime 26. Jul 2007 12:40

Re: Handle eines Fensters über die Processid?
 
hmm ok wie komme ich alle Fenster-handels von einer Processid?

Vjay 26. Jul 2007 12:43

Re: Handle eines Fensters über die Processid?
 
Geh alle Fenster durch und mach getWindowThreadProcessId

Luckie 26. Jul 2007 12:44

Re: Handle eines Fensters über die Processid?
 
...und vergleiche die mit deiner ProzesID.

gandime 26. Jul 2007 13:07

Re: Handle eines Fensters über die Processid?
 
mit folgendem Code habe ich jetzt versucht das Handle zu finden aber hatte keinen Erfolg

Delphi-Quellcode:
 

ProcInfo: TProcessInformation;

function GetWindows(const hWnd: Longword; Param: PMyEnumParam): LongBool;
  stdcall;
var
  Len: Longint;
  dwThreadID:dword;
begin
  Result := True;
  if not (IsWindow(hWnd) and IsWindowVisible(hWnd)) then
    Exit;
  Len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
  if Len > 0 then
  begin
    if (ProcInfo.dwProcessId=GetWindowThreadProcessId(hWnd,nil)) then
    begin
      MessageBox(0, 'hier', 'joa', 0);
    end;
  end;
end;

begin
 EnumWindows(@GetWindows, LPARAM(@Param));
end;
kann es vlt daran liegen das ProcInfo.dwProcessId ein Cardinal ist und GetWindowThreadProcessId ein DWORD ist?

Luckie 26. Jul 2007 13:53

Re: Handle eines Fensters über die Processid?
 
So geht es:
Delphi-Quellcode:
function EnumWindowsProc(hWnd: THandle; lp: LPARAM): LongBool; stdcall;
var
  ID               : DWORD;
  len              : Integer;
  Caption          : PChar;
begin
  if IsWindow(hWnd) and IsWindowVisible(hWnd) then
  begin
    GetWindowThreadProcessId(hWnd, ID);
    if GetCurrentProcessId = ID then
    begin
      len := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
      Caption := GetMemory(len + 1);
      try
        SendMessage(hWnd, WM_GETTEXT, len, Integer(Caption));
        MessageBox(0, Caption, 'Test', 0);
      finally
        Freememory(Caption);
      end;
    end;
  end;
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWindowsProc, 0);
end;
GetWindowThreadID gibt nicht die ProzesID als Funktionsrückgabewert zurück, sondern im zweiten Parameter. Und wieder hilft es die Hilfe zu lesen:
Zitat:

Code:
hWnd
[in] Handle to the window.
lpdwProcessId
[out] Pointer to a variable that receives the process identifier. If this parameter is not NULL, GetWindowThreadProcessId copies the identifier of the process to the variable; otherwise, it does not.

Und
Zitat:

Code:
Return Value

The return value is the identifier of the thread that created the window.


gandime 26. Jul 2007 14:15

Re: Handle eines Fensters über die Processid?
 
genau so funktioniert es :-)
danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr.

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