【问题标题】:C#: How to capture global mouse/HID eventsC#:如何捕获全局鼠标/HID 事件
【发布时间】:2010-10-19 06:32:47
【问题描述】:

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

如果windows键是保留的,ctrl-alt之类的就可以了。

【问题讨论】:

    标签: c# hotkeys


    【解决方案1】:

    由于它使用 windows 键,因此可以使用热键绑定全局捕获该键。在msdn注册热键。

    编辑:鼠标滚轮事件似乎不像我假设的那样被视为键,并且无法为它们创建全局热键。

    您必须制作一个全局窗口消息挂钩并捕获 WM_MOUSEWHEEL 消息。但是您可能必须在 C/C++ 中执行此操作。下面是实现此功能的 C dll,您可以从 C# 调用 Hook 和 Unhook 来启用和禁用该功能。

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

    #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;
    }
    

    【讨论】:

    • 是的,就可以了。问题: (1) 我看到鼠标 X 按钮的键,但看不到滚轮。如何访问? (2) Windows 键的键枚举名称是什么? (3) 如何将给定的组合键输出回shell?
    【解决方案2】:

    这绝对可以通过全局挂钩来完成,here 是一个很好的 CodeProject 示例,说明如何做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多