SetWindowsHookEx (), хук не поддерживается? (Возможно) - PullRequest
1 голос
/ 02 марта 2010

Я пытаюсь изучить 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 () функция.

Может кто-нибудь пролить свет на этот вопрос? Я тянул свои волосы в течение нескольких дней, пытаясь заставить их работать, но мне не повезло.

1 Ответ

1 голос
/ 02 марта 2010

Я подозреваю, что это потому, что у вас есть консольное приложение, и система не отправляет уведомления об активации, создании, перемещении и т. Д. Консольных окон. Попробуйте сделать это обычным приложением Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...