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/)
-   -   Mit ExeNamen auf Fensterhandle zugreifen (https://www.delphipraxis.net/189687-mit-exenamen-auf-fensterhandle-zugreifen.html)

whiteF 10. Jul 2016 13:04

Mit ExeNamen auf Fensterhandle zugreifen
 
hallo,
ich würde gerne anhand eines ExeNamens auf ein Fenster zugreifen und dessen Höhe auslesen lassen.

Nun ist mir auch die Problematik bekannt, dass ein ProcessHandle mehrere FensterHandles haben kann. Die gesuchte "exe" datei ist von meiner firma erstellt worden und hat immer nur ein fenster.

Mit folgenden Funktionen habe ich jedoch ein kleines Problem:
Delphi-Quellcode:
uses
...TlHelp32...;
...
function GetWindowHandleByExeName(const AExeName: string): THandle;
...
  var
  WindowHandle: THandle;
...
function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): boolean;
stdcall;
var
  ProcessID: THandle;
begin
  ProcessID := 0;
  GetWindowThreadProcessID(AHandle, ProcessID);
  Result := not (ProcessID = LParam);
  if not Result then
    WindowHandle := AHandle;
end;

function GetWindowHandleByExeName(const AExeName: string): THandle;
var
  SnapShot: THandle;
  p: TProcessEntry32;
  ProcessHandle: THandle;
begin
  Result := 0;
  WindowHandle := 0;
  ProcessHandle := 0;
  p.dwSize := SizeOf(p);
  SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    if Process32First(SnapShot, p) then
      repeat
      if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then
        ProcessHandle := p.th32ProcessID;
      until (ProcessHandle <> 0) or not Process32Next(SnapShot, p);
    EnumWindows(@MyEnumWindowProc, ProcessHandle);
    Result := WindowHandle;
  finally
    CloseHandle(SnapShot);
  end;
end;
(von hier erhalten: https://www.delphi-treff.de/tipps-tr...mens-erhalten/)

>>> Compiler-Fehler bei:
GetWindowThreadProcessID(AHandle, ProcessID);
>>> Fehler-Beschreibung:
[dcc32 Fehler] UnitUsefullTools.pas(35): E2250 Es gibt keine überladene Version von 'GetWindowThreadProcessId', die man mit diesen Argumenten aufrufen kann

Der Compiler stört sich an der ProcessID, welches ein THandle ist. Lt. der Funktion wird jedoch ein DWORD benötigt.

Nur ist mir diese Funktion "MyEnumWindowProc" vom Ablauf nicht nachvollziehbar und weiß mir daher nicht selbst zu helfen.
(Die Funktion "GetWindowHandleByExeName" habe ich nachvollziehen können)

Könnt ihr mir da etwas unter die Arme greifen?

Helmi 10. Jul 2016 14:19

AW: Mit ExeNamen auf Fensterhandle zugreifen
 
Hallo,

schon mal:
Delphi-Quellcode:
var
  ProcessID: Dword;//THandle;
oder
Delphi-Quellcode:
var
//  ProcessID: THandle;
  ProcessID: Cardinal;
ausprobiert?

whiteF 10. Jul 2016 18:57

AW: Mit ExeNamen auf Fensterhandle zugreifen
 
Der Austausch durch DWORD lässt den Compiler nicht mehr meckern. Jedoch bekomme ich ein Fenster-Handle "0" raus (PHandle existiert aber). Obwohl meine testanwendung nach der ich suche läuft (skype, thunderbird...).

Nach weiteren Recherchen war noch ein weiterer Fehler enthalten.
Jetzt läuft es wie es soll...


Das hier
Delphi-Quellcode:
function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): boolean;
stdcall;
muss durch das ersetzt werden:
Delphi-Quellcode:
function MyEnumWindowProc(AHandle: THandle; LParam: LongWord): Bool;
stdcall;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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