Я пытаюсь изучить Windows API. В настоящее время у меня много проблем, пытаясь заставить крючки работать. У меня есть некоторый пример кода, с которым я возился в течение нескольких дней - он имеет графический интерфейс, написанный на C # или что-то в этом роде, и dll на C ++. У dll есть эта функция, выведенная наружу:
bool __declspec(dllexport) InstallHook(){
g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstance, 0);
return g_hHook != NULL;
}
CBT Proc это тоже в 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;
}
Когда я запускаю этот код парней, все работает нормально. У него есть вызов InstallHook (), похороненный где-то в его C # GUI, и если я добавлю точку останова в функцию CBTProc, я вижу, что она вызывается системой снова и снова. Поскольку я не совсем понимаю C #, я пытаюсь вырезать его с помощью следующего (крошечного) консольного приложения:
int _tmain(int argc, _TCHAR* argv[]){
bool bbbb = InstallHook();
Sleep(2000);
return 0;
}
Моя проблема в том, что если я это сделаю, хук больше не работает. С помощью отладчика я вижу, что InstallHook () вызывается правильно, и что g_hHook в этой функции не является нулевым, но функция CBTProc вообще не вызывается - как будто система забывает о хуке, как только она покидает InstallHook () функция.
Может кто-нибудь пролить свет на этот вопрос? Я тянул свои волосы в течение нескольких дней, пытаясь заставить их работать, но мне не повезло.