代码之家  ›  专栏  ›  技术社区  ›  tsilb

C#:如何捕获全局鼠标/HID事件

  •  0
  • tsilb  · 技术社区  · 17 年前

    我想写一个小工具,当用户按下Windows按钮并向上或向下滚动鼠标滚轮时,它将捕获一个全局事件。当捕捉到这样的事件时,我希望将所述输出重定向到Win-+或Win-(加/减)的虚拟击键组合。这能做到吗?

    如果windows键是保留的,则按ctrl-alt或类似方式即可。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Nick Whaley    17 年前

    由于它使用windows密钥,因此可以使用热键绑定全局捕获密钥。登记处 msdn

    编辑:似乎鼠标滚轮事件没有像我假设的那样被视为键,并且没有办法为它们生成全局热键。

    警告:我尚未测试此代码,仅作为演示提供。

    #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;
    }
    
        2
  •  0
  •   John T    17 年前

    这完全可以通过全局钩子实现, here 这是一个关于如何做到这一点的很好的代码项目示例。