web-dev-qa-db-fra.com

Obtenir HWND du processus en cours

J'ai un processus en c ++ dans lequel j'utilise une API de fenêtre. Je veux obtenir le HWND de son propre processus. Veuillez me guider, comment puis-je rendre cela possible.

16
Siddiqui

Vous supposez (à tort) qu'un processus ne comporte qu'un seul HWND. Ce n'est généralement pas vrai et Windows ne peut donc pas proposer d'API pour l'obtenir. Un programme peut créer deux fenêtres et avoir deux HWND en conséquence. OTOH, si votre programme ne crée qu'une seule fenêtre, il peut stocker ce HWND dans une variable globale.

14
MSalters

Si vous parlez d'obtenir un descripteur processus, il ne s'agit pas d'une HWND (qui est un w i nd ow h andle ), mais une HANDLE (c'est-à-dire un descripteur d'objet du noyau); Pour récupérer un pseudo-descripteur relatif au processus en cours, vous pouvez utiliser GetCurrentProcess comme l'ont expliqué les autres.

Par contre, si vous voulez obtenir une HWND (une fenêtre fenêtre) dans la fenêtre principale de votre application, vous devez parcourir les fenêtres existantes avec EnumWindows et en vérifier la propriété. avec GetWindowThreadProcessId , en comparant l'ID de processus renvoyé avec celui renvoyé par GetCurrentProcessId . Néanmoins, dans ce cas, vous feriez mieux de sauvegarder votre poignée de fenêtre principale dans une variable lorsque vous la créez plutôt que de faire tout ce bazar.

Quoi qu'il en soit, gardez toujours à l'esprit que tous les descripteurs ne sont pas identiques: HANDLEs et HWNDs, en particulier, sont des objets complètement différents: les premiers sont des descripteurs de noyau (= descripteurs des objets gérés par le noyau) et sont manipulés avec une manipulation générique de descripteurs de noyau. fonctions (DuplicateHandle, CloseHandle, ...), tandis que les deuxièmes sont des poignées relatives au gestionnaire de fenêtres, qui est un élément complètement différent du système d’exploitation, et sont manipulées avec un ensemble de fonctions différent.

En fait, en théorie une HWND peut avoir la même valeur "numérique" que HANDLE, mais ils feraient référence à des objets complètement différents.

17
Matteo Italia

La fonction GetCurrentProcess() renvoie un pseudo-descripteur faisant référence au processus en cours. Ce descripteur peut être utilisé dans la plupart des fonctions de l'API Win32 qui utilisent un paramètre de descripteur de processus.

La documentation contient plus d'informations sur ce pseudo-descripteur, y compris comment le convertir en descripteur réel si nécessaire.

5
Greg Hewgill

Obtenez votre fenêtre de console

GetConsoleWindow();


"La valeur de retour est un descripteur de la fenêtre utilisée par la console associée au processus appelant ou NULL s’il n’existe pas de telle console associée."

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

Obtenir d'autres fenêtres

GetActiveWindow() pourraitPASêtre la réponse, mais cela pourrait être utile
"La valeur de retour est le handle de la fenêtre active attachée à la file de messages du thread appelant. Sinon, la valeur de retour est NULL." > msdn Documents GetActiveWindow ()

Cependant, les fenêtres n'apparaissent pas simplement -vous devez donc récupérer le descripteur à l'endroit où vous/votre application avez créé la fenêtre ... _ p. Ex. CreateWindow() renvoie HWND handle afin que tout ce dont vous avez besoin est de le sauvegarder et de le récupérer ...

5
jave.web

Vous pouvez utiliser HANDLE WINAPI GetCurrentProcess(void); à partir de Kernel32.dll.

Voir entrée MSDN ici .

2
Stu Mackellar

Voici une autre réponse:

this-> GetSafeHwnd ();

0
SChalice

Mon exemple n’est pas de traiter le processus, mais vous avez peut-être besoin de ceci:

HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);

Ceci renvoie HWND du contrôle spécifié par son IDCL_COMBOBOX.

0
Denis Kolesnik