2017-09-16 3 views
-3

J'ai un tableau de hWnds de boutons que je veux surveiller pour les clics. J'ai aussi un éventail de HWINEVENTHOOK que je vais utiliser pour les surveiller. GetWindowThreadProcessID me donne un ID de processus LPDWORD, qui n'est pas accepté par SetWinEventHook. Je ne suis pas clair sur ce qu'est un LPDWORD. S'il vous plaît aider?C++ Qu'est-ce que LPDWORD?

Code fixe ci-dessous

Merci à tous ceux qui a fait remarquer que LPDWORD est juste un pointeur vers un DWORD.

Code:

int i = 0; 
for (HWND hWnd : hWnds) { 
    DWORD processID = 0; 
    DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); 
    hooks[i] = SetWinEventHook(EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, 
    NULL, 
     WinEventProcCallback, processID, threadID, WINEVENT_OUTOFCONTEXT); 
     i++; 
} 
+3

'DWORD processID = 0;' et 'GetWindowThreadProcessId (hWnd, & processID)' et 'SetWinEventHook (EVENT_OBJECT_INVOKED, EVENT_OBJECT_INVOKED, NULL, WinEventProcCallback, processID, ThreadID, WINEVENT_OUTOFCONTEXT)' Quel est le problème ?? – user0042

+2

C'est juste un mauvais code et il va planter quand vous essayez de l'exécuter. Vous devez utiliser 'DWORD processID' et passer' & processID' pour le second argument. En d'autres termes, vous passez un DWORD par référence afin que la fonction Winapi puisse mettre à jour votre variable. Système hongrois à la rescousse, hehe. –

+1

@HansPassant qui n'est pas une référence qui est l'adresse de (c'est-à-dire un pointeur vers) –

Répondre

1

LPDWORD est juste un typedef pour DWORD* et quand un paramètre de fonction Windows SDK est un « LPsomething » il faut généralement passer un pointeur vers un « quelque chose » (à l'exception du LP [C] [W] STR types de chaînes).

DWORD processID; 
DWORD threadID = GetWindowThreadProcessId(hWnd, &processID); 
if (threadID) 
{ 
    // Do something with threadID and/or processID 
} 

Le Kit de développement Windows utilise Systems Hungarian notation pour l'API Desktop/Classic.

+0

Le SDK Windows * parfois * utilise la notation hongroise Systems, pas toujours. A titre d'exemple, les préfixes 'cch' et' cb' sont clairement des notations hongroises d'Apps. Et la plupart des interfaces COM utilisent la notation hongroise Apps tout au long. En outre, les types 'LP [C] [W | A | T] STR' * font * pointer vers" quelque chose ", à savoir un tableau de caractères à zéro terminé. – IInspectable

+0

Je n'ai jamais dit que les types de chaînes ne pointent sur rien mais dans le contexte de cette question ce serait 'LPTSTR *' si la chaîne est allouée/définie par la fonction appelée. – Anders

+0

Dans ce cas, vous devriez soit développer ceci, soit abandonner complètement cette remarque. À l'heure actuelle, cela laisse trop de place à l'interprétation. – IInspectable