Как я могу имитировать Alt + Tab с помощью хуков Win32? - PullRequest
4 голосов
/ 03 декабря 2011

Я написал эту программу на C ++, используя VS2010, чтобы определить, когда пользователь дважды щелкает среднюю кнопку мыши, переключиться на следующее окно (как это делает Alt + Tab) и остановить цепочку хуков.Вот мой код:

DLL:

extern "C"__declspec (dllexport)
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode<0)
        return CallNextHookEx(NULL,nCode,wParam,lParam);

    if (wParam == WM_MBUTTONDBLCLK) 
    {
        PostMessage(GetActiveWindow(),WM_SYSCOMMAND,SC_NEXTWINDOW,0);
    }
    else 
        return CallNextHookEx(NULL,nCode,wParam,lParam);
    // if EVERYTHING_IS_OK
    return TRUE;
}

EXE:

do{
nMenu = choose();
switch (nMenu)
{
case 1:
    hLib = LoadLibrary(cLibName);
    hProc = (HOOKPROC) GetProcAddress(hLib, "HookProc");
    hHook = SetWindowsHookEx(WH_MOUSE, hProc, hLib, NULL);
    break;
case 2:
    UnhookWindowsHookEx(hHook);
    break;
case 0:
    ;
}
} while (nMenu);

Я запускаю программу и устанавливаю ловушку, затем программа зависает и мышь перестает работать вбольшинство приложений (продолжает работать в Chrome, хотя).Что я делаю не так?

1 Ответ

3 голосов
/ 03 декабря 2011

Крючки - это зло, если они не используются только как уведомления.MSDN настоятельно рекомендует позвонить по номеру CallNextHookEx().Вы не можете знать, в какой точке цепочки вызовов вы находитесь.Это делает ваш код хрупким, даже если на первый взгляд может показаться, что он работает.

Вы зависите от других пользователей API подключения, которые будут любезны с вами, т. Е. Будут звонить вам.Если кто-то (как и вы) этого не делает, ваш код ломается.

Не вдаваясь в подробности, где ваш код ломается, я думаю, что не очень удивительно, что

мышь перестает работать в большинстве приложений

, если вы закрыли других пользователей ловушкой мыши, вернув TRUE, не так ли?

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