2010-03-02 6 views
1

J'essaie d'apprendre l'API Windows. Actuellement, j'ai beaucoup de mal à essayer de me mettre au travail. J'ai un exemple de code avec lequel je me suis amusé pendant quelques jours - il a une interface graphique écrite en C# ou quelque chose, et une DLL en C++. Le dll a cette fonction extériorisée:SetWindowsHookEx(), le crochet n'est pas maintenu? (éventuellement)

bool __declspec(dllexport) InstallHook(){ 
    g_hHook  = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstance, 0); 
    return g_hHook != NULL; 
} 

CBT Proc est-ce, également dans le dll:

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam){ 
    if (nCode < 0) 
     return CallNextHookEx(g_hHook, nCode, wParam, lParam); 
    /* Something should go here to do stuff when certain nCodes are recieved.*/ 
    return 0; 
} 

Quand je lance ce code gars, tout fonctionne très bien. Il a un appel à InstallHook() enterré quelque part dans son interface graphique C#, et si je mets un point d'arrêt dans la fonction CBTProc, je peux voir qu'il est appelé encore et encore par le système. Comme je ne comprends pas vraiment C#, je suis en train de le couper avec l'application console suivante (minuscule):

int _tmain(int argc, _TCHAR* argv[]){ 
    bool bbbb = InstallHook(); 
    Sleep(2000); 
    return 0; 
} 

Mon problème est que si je fais cela, le crochet ne fonctionne plus. Avec le débogueur je peux voir que InstallHook() est appelé correctement, et que g_hHook dans cette fonction n'est pas null, mais la fonction CBTProc n'est pas appelée du tout - c'est comme si le système oublie le hook dès qu'il quitte l'InstallHook() fonction.

Quelqu'un peut-il mettre en lumière ce problème? Je me suis arraché les cheveux pendant des jours pour essayer de le faire fonctionner, mais je n'ai pas eu de chance.

Répondre

1

Je suppose que c'est parce que vous avez une application console et que le système n'envoie pas de notifications sur l'activation, la création, le déplacement, etc. des fenêtres de la console. Essayez de rendre l'application Windows normale.

+0

Cela a fonctionné, merci. C'est un peu ennuyeux car mon programme est passé de 4 lignes à 100 pour initialiser toutes les fenêtres, mais je suis content que cela fonctionne. – Oliver