2013-08-04 14 views
14

Sto provando a utilizzare la funzione SetForegroundWindow(HWND hWnD). Ho alcune maniglie ma non funziona come parametro della funzione precedente. Il mio manico è un thread e voglio eseguirlo in primo piano.Differenza tra HANDLE e HWND nell'API di Windows?

Quali sono le differenze tra un HWND e una MANIGLIA?

risposta

8

Un "handle" è il termine generico utilizzato per indicare un token che identifica una risorsa sul sistema (un menu, un modulo DLL, un blocco di memoria, ecc.). Spesso indicato come "cookie magico", viene normalmente restituito quando si crea la risorsa per la prima volta. Quindi si passa quell'handle ad altre funzioni nell'API responsabile dell'elaborazione della risorsa. Normalmente non è necessario sapere qual è la maniglia. A volte può essere un puntatore, altre volte un numero, forse una struttura o qualsiasi altra cosa. Ecco perché lo nascondono usando nomi come HWND, che è semplicemente l'handle utilizzato per identificare una finestra (restituita dalla funzione API "CreateWindow()"). Pertanto non si converte un "handle" in un HWND e di nuovo indietro poiché un HWND è già un "handle" (uno che identifica semplicemente le finestre create).

trovato qui http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND

È possibile utilizzare FindWindow per ottenere l'hWnd da un'applicazione http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

Questo dovrebbe consentire di ottenere il HWND a patto di avere la maniglia per quello che stai cercando per C++ Handle as HWND?

+0

sì, tks !, ma posso convertire da handle a hwnd? – Thangnv

+1

@Thangnv Questo è come chiedere "Posso convertire da' void * 'a' int * '?" Dipende. Qual è la tua maniglia? – timothyqiu

+0

Il mio handle è un thread e voglio eseguirlo in primo piano, ma non è un HWND in funzione SetForegroundWindow (HWND hWnD). – Thangnv

27

Sono solo abstract data types.

Secondo MSDN, HANDLE e HWND sono definiti come:

  • HANDLE è un handle ad un oggetto.
  • HWND è un handle per una finestra.

Così, un HWND è un HANDLE, ma non tutte le HANDLE s sono HWND. Infatti:

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

Esempio

Si dovrebbe passare solo HWND per SetForegroundWindow se non si sa cosa si sta facendo.

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

Questo primo ha l'handle per una finestra intitolata "Calcolatrice" con FindWindow e poi porta a quella finestra in primo piano.

+4

Questi typedef vengono utilizzati solo se 'STRICT' non è definito. Se lo è, un 'HWND' non è più definito come' HANDLE', ma come un tipo di dati unico e indipendente. –

+3

@RemyLebeau La parte 'typedef' è stata citata da [il documento ufficiale] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx). (Ma ho controllato l'intestazione, che è definita nel modo in cui hai descritto. Grazie.) – timothyqiu