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.
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