web-dev-qa-db-fra.com

Différence entre HANDLE et HWND dans l'API Windows?

J'essaie d'utiliser la fonction SetForegroundWindow(HWND hWnD). J'ai quelques poignées mais cela ne fonctionne pas comme paramètre de la fonction ci-dessus. Ma poignée est un fil et je veux l'exécuter au premier plan.

Quelles sont les différences entre un HWND et un HANDLE?

18
Thangnv

Ce sont juste types de données abstraits .

Selon MSDN , HANDLE et HWND sont définis comme:

  • HANDLE est un handle vers un objet.
  • HWND est un descripteur de fenêtre.

Ainsi, un HWND est un HANDLE, mais tous les HANDLE ne sont pas HWND. En réalité:

typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;

Exemple

Vous ne devez transmettre que HWND à SetForegroundWindow sauf si vous savez ce que vous faites.

HWND hWnd = FindWindow(NULL, "Calculator");
SetForegroundWindow(hWnd);

Cela obtient d'abord le handle d'une fenêtre intitulée "Calculatrice" avec FindWindow, puis met cette fenêtre au premier plan.

33
timothyqiu

Un "handle" est le terme général utilisé pour faire référence à un jeton qui identifie une ressource sur le système (un menu, un DLL, un bloc de mémoire, etc.). Souvent appelé un "cookie magique", il est normalement renvoyé lorsque vous créez la ressource pour la première fois. Vous passez ensuite ce handle à d'autres fonctions de l'API responsable du traitement de la ressource. Vous n'avez normalement pas besoin de savoir ce qu'est le handle cependant. Parfois, il peut s'agir d'un pointeur , d'autres fois un nombre, peut-être une structure, ou autre. C'est pourquoi ils le cachent en utilisant des noms comme HWND qui est simplement le handle utilisé pour identifier une fenêtre (retourné par la fonction API "CreateWindow ()"). convertir un "handle" en HWND et vice-versa car un HWND est déjà un "handle" (qui identifie simplement les fenêtres que vous créez).

Trouvé ici http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND

Vous pouvez utiliser FindWindow pour obtenir le hwnd à partir d'une application http://msdn.Microsoft.com/en-us/library/windows/desktop/ms633499 (v = vs.85) .aspx

Cela devrait vous permettre d'obtenir le HWND à condition que vous ayez la poignée de ce que vous recherchez C++ Handle as HWND?

11
Spencer

Le HWND est également un MANCHE, mais global. C'est à dire. un HWND valide dans le contexte d'un processus est également valide dans le contexte d'un autre processus.

Quelques informations non documentées sur http://forum.sysinternals.com/internal-wnd-structure-in-win7_topic24988.html .

6