C #: Как захватить глобальные события мыши / HID - PullRequest
0 голосов
/ 14 апреля 2009

Я хочу написать небольшой инструмент, который будет фиксировать глобальное событие, когда пользователь нажимает кнопку Windows и прокручивает колесико мыши вверх или вниз. Когда такое событие фиксируется, я хочу перенаправить указанный вывод в виртуальную комбинацию клавиш Win- + или Win-- (плюс / минус). Можно ли это сделать?

Если ключ windows зарезервирован, подойдет ctrl-alt или другой.

Ответы [ 2 ]

1 голос
/ 14 апреля 2009

Поскольку он использует ключ windows, ключ может быть захвачен глобально с помощью привязки горячих клавиш. RegisterHotKey на msdn .

Редактировать: Кажется, что события колесика мыши не считаются ключами, как я предполагал, и нет способа создать глобальную горячую клавишу для них.

Вам нужно будет перехватить сообщение глобального окна и перехватить сообщение WM_MOUSEWHEEL. Но вам, возможно, придется сделать это в C / C ++. Ниже приведена Cll для выполнения этого. Вы можете вызвать Hook и Unhook из C #, чтобы включить и отключить функцию.

ВНИМАНИЕ: я не проверял этот код и предоставляется только в качестве демонстрации.

#include <windows.h>

HINSTANCE myInstance;
HHOOK thehook = 0;
BOOL isWinKeyDown = FALSE;

extern "C" LRESULT __declspec(dllexport)__stdcall CALLBACK HookHandler(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == WM_KEYDOWN && (wParam == VK_LWIN || wParam == VK_RWIN))
        isWinKeyDown = TRUE;
    else if (nCode == WM_KEYUP && (wParam == VK_LWIN || wParam == VK_RWIN))
        isWinKeyDown = FALSE;
    else if (nCode == WM_MOUSEHWHEEL && isWinKeyDown) {
        if (HIWORD(wParam) > 0) { //mousewheel up
            CallNextHookEx(thehook, WM_KEYDOWN, VK_ADD, 0);
            CallNextHookEx(thehook, WM_KEYUP, VK_ADD, 0);
        } else { //mousewheel down
            CallNextHookEx(thehook, WM_KEYDOWN, VK_SUBTRACT, 0);
            CallNextHookEx(thehook, WM_KEYUP, VK_SUBTRACT, 0);
        }
        return 0;
    }
    return CallNextHookEx(thehook, nCode, wParam, lParam);
}
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fwdReason, LPVOID lpvReserved) {
    switch(fwdReason)
    {
        case DLL_PROCESS_ATTACH: {
            DisableThreadLibraryCalls(hInstance);
            myInstance = hInstance;

            } break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_PROCESS_DETACH:

            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return(TRUE);               // The initialization was successful, a FALSE will abort
                                // the DLL attach
}

extern "C" void __declspec(dllexport) Hook() {
    if (!thehook)
        thehook = SetWindowsHookEx(WH_CALLWNDPROC, &HookHandler, myInstance, 0);
}
extern "C" void __declspec(dllexport) UnHook() {
    if (thehook)
        UnhookWindowsHookEx(thehook);
    thehook = 0;
}
0 голосов
/ 14 апреля 2009

Это определенно можно сделать с помощью глобальных хуков, здесь - отличный пример того, как это сделать.

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