Handle abrufen über PID
lima-city → Forum → Programmiersprachen → Delphi & Pascal
ansehen
anwendung
brauch
code
durchsuchen
erhalten beitrag
fenster
frage
helfen
holen
http
idee
info
not
programmierer
schleife
support
system
tip
vergleichen
-
Hi,
Wie kann ich in Delphi das Mainwindow Handle von einem Prozess abrufen, von dem ich die Prozess-ID kenne?
h: HWND;
h := OpenProcess(PROCESS_ALL_ACCESS,False,MyPID);
funktioniert nicht bzw. bekomm ich damit nicht das Hauptfenster, v.a. wenn das fremde Programm eine Delphi-Anwendung ist, denn bei diesen ist das Hauptfenster versteckt, also brauche ich davon das Fenster, das der Benutzer sieht.
Ich hoffe, dass ihr mir helfen könnt ;) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du willst zwar nicht den Fenster-Handle über den EXE-Namen, aber das hier sollte helfen:
http://www.dsdt.info/tipps/?id=638
Frage: bist du nicht normalerweise ein VB-Programmierer? -
Du willst zwar nicht den Fenster-Handle über den EXE-Namen, aber das hier sollte helfen:
http://www.dsdt.info/tipps/?id=638
Frage: bist du nicht normalerweise ein VB-Programmierer?
In Delphi war mir das zu umständlich, dein Tipp hat auch nicht weitergeholfen...
Jetzt hab ich es in C++ gelöst ;)
P.S.: Ja meistens arbeite ich mit Visual Basic, des Öfteren aber auch mit Delphi oder auch ab und zu mit C / C++
Nachtrag:
Ich brauch jetzt doch trotzdem eine Lösung für Delphi...
Testweise hab ich\'s mit FindWindow() probiert und damit funktioniert es.
Allerdings will ich das Handle nicht über den Titel bekommen, sondern über die Process ID, denn es gibt eventuell mehrere Anwendungen mit dem gleichen Titel.
Die Process ID hab ich bereits ermittelt. Jetzt will ich über die PID das Handle erhalten?
Beitrag geändert: 7.1.2008 18:45:38 von cbhp -
Ich brauch jetzt doch trotzdem eine Lösung für Delphi...
Testweise hab ich\'s mit FindWindow() probiert und damit funktioniert es.
Allerdings will ich das Handle nicht über den Titel bekommen, sondern über die Process ID, denn es gibt eventuell mehrere Anwendungen mit dem gleichen Titel.
Die Process ID hab ich bereits ermittelt. Jetzt will ich über die PID das Handle erhalten?
Beitrag geändert: 7.1.2008 18:45:38 von cbhp
Laß\' mal den Source für C++ ansehen, vielleicht finde ich dann leichter eine Lösung für Delphi!
Hab\' nochmal gegoogelt: Du hast die Lösung eh selbst gefunden. Mit einer Schleife die Fenster durchsuchen, vom Fenstertitel die PID holen, und die dann mit der PID vergleichen, die du ja schon hast -> gefunden!
Ist zwar in VB, aber die Idee ist ja gut:
http://support.microsoft.com/kb/242308/de
Beitrag geändert: 8.1.2008 7:40:19 von burgi -
burgi schrieb:
Laß\\\' mal den Source für C++ ansehen, vielleicht finde ich dann leichter eine Lösung für Delphi!
Hab\\\' nochmal gegoogelt: Du hast die Lösung eh selbst gefunden. Mit einer Schleife die Fenster durchsuchen, vom Fenstertitel die PID holen, und die dann mit der PID vergleichen, die du ja schon hast -> gefunden!
Ist zwar in VB, aber die Idee ist ja gut:
http://support.microsoft.com/kb/242308/de
Beitrag geändert: 8.1.2008 7:40:19 von burgi
Ja das wäre eine Lösung, die mir aber zu umständlich wirkt und doppelt so lange dauert.
Da muss es doch was einfacheres auch geben...
Mein C++ Code wird wohl kaum auf Delphi übertragbar sein, denn ich hab .Net Framework verwendet und ich hab nur Delphi 7.
System::Diagnostics::Process^ myProcess = System::Diagnostics::Process::GetProcessById(myPid); System::IntPtr myHWND = myProcess->MainWindowHandle;
-
Ja das wäre eine Lösung, die mir aber zu umständlich wirkt und doppelt so lange dauert.
Da muss es doch was einfacheres auch geben...
Mein C++ Code wird wohl kaum auf Delphi übertragbar sein, denn ich hab .Net Framework verwendet und ich hab nur Delphi 7.
System::Diagnostics::Process^ myProcess = System::Diagnostics::Process::GetProcessById(myPid); System::IntPtr myHWND = myProcess->MainWindowHandle;
Leider hhast du Recht! Das geht nicht einfacher! Hab\' trotz intensiven Googelns nichts passendes gefunden, auch nicht bei CodeGear.
Tut Leid!
Aber laß\' es mich wissen, solltest du trotzdem noch eine Lösung finden! -
Nun hab ich die Lösung gefunden:
Deklaration
type PEnumInfo = ^TEnumInfo; TEnumInfo = record ProcessID: DWORD; HWND: THandle; end;
Benötigte Funktionen
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; end; function FindMainWindow(PID: DWORD): DWORD; var EI: TEnumInfo; begin EI.ProcessID := PID; EI.HWND := 0; EnumWindows(@EnumWindowsProc, Integer(@EI)); Result := EI.HWND; end;
Verwendung
myHwnd := FindMainWindow(myPID);
Schon erhält man über die Prozess-ID das MainWindowHandle (HauptHandle), wie es auch FindWindow() zurückgeben würde. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage