0

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

如果 windows 键被保留, ctrl-alt 或类似的就可以了。

4

2 回答 2

1

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

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

您必须制作一个全局窗口消息挂钩并捕获 WM_MOUSEWHEEL 消息。但是您可能必须在 C/C++ 中执行此操作。完成此操作的 AC 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;
}
于 2009-04-14T03:08:50.753 回答
0

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

于 2009-04-14T03:02:35.667 回答