wake-up-neo.com

HWND des aktuellen Prozesses erhalten

Ich habe einen Prozess in C++, in dem ich die Fenster-API verwende. Ich möchte die HWND des eigenen Prozesses erhalten. Bitte leite mich, wie ich es möglich machen kann.

16
Siddiqui

Sie gehen (falsch) davon aus, dass ein Prozess nur eine einzige HWND hat. Dies ist im Allgemeinen nicht zutreffend und daher kann Windows keine API anbieten, um diese Funktion zu erhalten. Ein Programm kann zwei Fenster erstellen und hat als Ergebnis zwei HWNDs. OTOH: Wenn Ihr Programm nur ein einzelnes Fenster erstellt, kann es diese HWND in einer globalen Variablen speichern.

14
MSalters

Wenn Sie davon sprechen, ein Prozess -Handle zu erhalten, dann ist es keine HWND (was eine w i nd ow h andle ist ), aber eine HANDLE (dh ein Kernel-Objekt-Handle); Um ein Pseudo-Handle relativ zum aktuellen Prozess abzurufen, können Sie GetCurrentProcess verwenden, wie die anderen erläutert haben.

Wenn Sie dagegen ein HWND (ein Fenster Handle) für das Hauptfenster Ihrer Anwendung erhalten möchten, müssen Sie die vorhandenen Fenster mit EnumWindows durchgehen und deren Besitz überprüfen mit GetWindowThreadProcessId , Vergleichen der zurückgegebenen Prozess-ID mit der von GetCurrentProcessId zurückgegebenen. In diesem Fall sollten Sie jedoch den Hauptfenster-Handle in einer Variablen speichern, wenn Sie sie erstellen, anstatt all dieses Durcheinander zu tun.

Denken Sie jedoch immer daran, dass nicht alle Handles gleich sind: Insbesondere HANDLEs und HWNDs sind völlig verschiedene Bestien: Die ersten sind Kernel-Handles (= Handles für kernelverwaltete Objekte) und werden mit der generischen Kernel-Handles-Manipulation bearbeitet Funktionen (DuplicateHandle, CloseHandle, ...), während die zweiten Funktionen relativ zum Fenstermanager sind, der ein völlig anderer Bestandteil des Betriebssystems ist, und mit anderen Funktionen bearbeitet werden.

Tatsächlich kann eine HWND den gleichen "numerischen" Wert einer HANDLE haben, aber sie würden sich auf völlig andere Objekte beziehen.

17
Matteo Italia

Die Funktion GetCurrentProcess() gibt ein Pseudo-Handle zurück, das auf den aktuellen Prozess verweist. Dieses Handle kann in den meisten Win32-API-Funktionen verwendet werden, die einen Prozess-Handle-Parameter annehmen.

Die Dokumentation enthält weitere Informationen zu diesem Pseudo-Handle, einschließlich der Konvertierung in ein reales Handle, falls erforderlich.

5
Greg Hewgill

Holen Sie sich Ihr Konsolenfenster

GetConsoleWindow();


"Der Rückgabewert ist ein Handle für das Fenster, das von der Konsole verwendet wird, die dem aufrufenden Prozess zugeordnet ist, oder NULL, wenn keine solche Konsole vorhanden ist."

https://msdn.Microsoft.com/de-de/library/windows/desktop/ms683175(v=vs.85).aspx

Holen Sie sich andere Fenster

GetActiveWindow() könnteNICHTdie Antwort sein, aber es könnte nützlich sein
"Der Rückgabewert ist das Handle des aktiven Fensters, das an die Nachrichtenwarteschlange des aufrufenden Threads angehängt ist. Andernfalls ist der Rückgabewert NULL." > msdn GetActiveWindow () docs

Die Fenster werden jedoch nicht einfach aufgerissen -Sie sollten also das Handle von dem Ort abrufen, an dem Sie/Ihre App das Fenster erstellt haben ...CreateWindow() gibt HWND zurück. Alles was Sie brauchen, ist es zu speichern und abzurufen ...

5
jave.web

Sie können HANDLE WINAPI GetCurrentProcess(void); von Kernel32.dll verwenden.

Siehe MSDN-Eintrag hier .

2
Stu Mackellar

Hier ist eine andere Antwort:

this-> GetSafeHwnd ();

0
SChalice

Mein Beispiel ist nicht mit dem Prozess umgehen, aber vielleicht brauchen Sie das:

HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);

Dies gibt HWND des durch seinen IDCL_COMBOBOX angegebenen Steuerelements zurück.

0
Denis Kolesnik