Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:如何捕获全局鼠标/HID事件_C#_Hotkeys - Fatal编程技术网

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

C#:如何捕获全局鼠标/HID事件,c#,hotkeys,C#,Hotkeys,我想写一个小工具,当用户按下Windows按钮并向上或向下滚动鼠标滚轮时,它将捕获一个全局事件。当捕捉到这样的事件时,我希望将所述输出重定向到Win-+或Win-(加/减)的虚拟击键组合。这能做到吗 如果保留了windows键,则可以使用ctrl-alt或类似方式。这肯定可以通过全局挂钩来完成,这是一个很好的CodeProject示例,说明了如何执行此操作。由于它使用windows键,因此可以使用热键绑定全局捕获该键。登记处 编辑:似乎鼠标滚轮事件没有像我假设的那样被视为键,并且没有办法为它们生

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


如果保留了windows键,则可以使用ctrl-alt或类似方式。

这肯定可以通过全局挂钩来完成,这是一个很好的CodeProject示例,说明了如何执行此操作。

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

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

您必须创建一个全局窗口消息挂钩并捕获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;
}
#包括
举个例子;
HHOOK thehook=0;
BOOL-isWinKeyDown=FALSE;
外部“C”LRESULT uu declspec(dllexport)uu stdcall回调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_mouseheel&&isWinKeyDown){
如果(HIWORD(wParam)>0){//mousewheel up
调用nexthookex(hook,WM_键向下,VK_添加,0);
调用nexthookex(hook,WM\u KEYUP,VK\u ADD,0);
}否则{//鼠标将滚轮向下移动
调用nexthookex(hook,WM_键向下,VK_减法,0);
调用nexthookex(hook,WM_KEYUP,VK_减法,0);
}
返回0;
}
返回下一个调用hook(hook、nCode、wParam、lParam);
}
BOOL WINAPI DllMain(HINSTANCE HINSTANCE、DWORD fwdReason、LPVOID lpvReserved){
交换机(fwdReason)
{
案例DLL\u进程\u附加:{
禁用线程库调用(hInstance);
myInstance=hInstance;
}中断;
案例DLL\u线程\u连接:
打破
案例DLL\u进程\u分离:
打破
案例DLL\u线程\u分离:
打破
}
return(TRUE);//初始化成功,FALSE将中止
//DLL附加
}
外部“C”void_uudeclspec(dllexport)Hook(){
如果(!thehook)
hook=SetWindowsHookEx(WH_调用Wndproc和HookHandler,myInstance,0);
}
外部“C”无效uu declspec(dllexport)UnHook(){
如果(钩子)
解开钩子(钩子);
hook=0;
}

是的,就这样。问题:(1)我看到鼠标X键的键,但没有看到方向盘的键。如何访问?(2) Windows密钥的密钥枚举名称是什么?(3) 如何将给定的键组合输出回shell?