2012-08-29 4 views
1

J'ai une application et souhaite surveiller MSWord en appuyant sur la touche (CROCHET LOCAL), mais je n'arrive pas à comprendre comment trouver le pid à utiliser! Le code ci-dessous CODE WORKS GOOD avec crochet global (pid = 0) et avec (pid = GetCurrentThreadId). Mais travailler avec GetWindowThreadProcessId Indifférent Fume:Local Hook ne fonctionne pas

 HWND hWindow = FindWindowEx(NULL,NULL,String("Notepad").w_str(),NULL); 
if (!hWindow) { 
    ShowMessage("hWindow fail"); 
    return; 
} 

unsigned long pid; 
GetWindowThreadProcessId(hWindow ,&pid); 

//pid = GetCurrentThreadId(); 
if (!hWindow) { 
    ShowMessage("pid fail"); 
    return; 
} 

String s = "HookDLL.dll"; 
DllHandle=LoadLibrary(s.w_str()); 
HOOKFCT_2 InstHook=reinterpret_cast<HOOKFCT_2> (GetProcAddress(DllHandle,"InstallHook")); 

if(!InstHook(pid, (void *)(callIt))) 
{ 
    Label1->Caption="Unable to install mouse hook!"; 
} 
else Label1->Caption="Mouse hook installed!"; 

Je serai très, très gratefull pour toute la lumière sur le problème ...

Avis:

  1. Je souhaite un crochet à MSWord seulement.

  2. Le code ci-dessus fonctionne, failling que lorsque vous essayez de brancher sur une autre application (i.e. .: ne pas utiliser pid = 0 ou pid = GetCurrentThreadId), ce qui = "Impossible d'installer le crochet de la souris!".

  3. J'essaie déjà FindWindow, FindWindowEx, GetForegroundWindow, GetActiveWindow; puisque pas de ces travaux, je crois que le problème est GetWindowThreadProcessId.

+0

'GetCurrentThreadId' renvoie uniquement un ID de thread, pas un ID de processus. Vous devez utiliser 'GetWindowThreadProcessId' pour récupérer l'ID de processus qui possède la fenêtre spécifiée. Notez que la fenêtre doit appartenir à l'application * MSWord *. Vérifiez également les documentations DLL de ce crochet pour toutes les limitations. Sans les détails sur la méthode que hook DLL utilise, il est impossible de deviner ce qui pourrait causer le problème. – Jay

Répondre

2

SetWindowsHookEx nécessite TID, ne pas traiter ID. Passez l'ID de thread à la place:

DWORD threadID = GetWindowThreadProcessId(hWindow, 0); 

if(!InstHook(threadID, (void *)(callIt))) {...} 
+0

Ok, mon erreur Je pense que GetWindowThreadProcessId retourne le threadId dans le second argument (passé par ref). MERCI – sgm

Questions connexes