C#中:如何捕获全球鼠标/ HID事件 [英] C#: How to capture global mouse/HID events

查看:319
本文介绍了C#中:如何捕获全球鼠标/ HID事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望写一个小工具,当用户按下Windows按钮和滚动鼠标滚轮向上或向下,将捕获的全球盛会。当捕捉到这样的事件,我愿表示重定向输出到Win- +或Win--(正/负)的虚拟按键组合。可以这样做?

I wish to write a small tool that will capture a global event when the user presses the Windows button and scrolls the mousewheel up or down. When such an event is captured, I wish to redirect said output to a virtual keystroke combination of Win-+ or Win-- (plus/minus). Can this be done?

如果Windows键被保留,CTRL-ALT或这样会怎么做。

If the windows key is reserved, ctrl-alt or such would do.

推荐答案

由于它使用Windows键,钥匙可以在全球范围内使用热键绑定抓获。 RegisterHotKey在 MSDN

Since it uses the windows key, the key can be captured globally using a hotkey binding. RegisterHotKey at msdn.

编辑:看来,鼠标滚轮事件不被视为关键,我认为并没有什么办法让他们的一个全局热键

It seems the mousewheel events are not treated as keys as I assumed and there is no way to make a global hotkey for them.

您都会有。做一个全局窗口消息钩子和陷阱WM_MOUSEWHEEL消息。但是,你可能不得不这样做,在C / C ++。 ,AC DLL来实现,这是下面,你可以叫钩脱开从C#启用和禁用此功能。

You will have to make a global window message hook and trap the WM_MOUSEWHEEL message. But you may have to do that in C/C++. A C dll to accomplish this is below, you can call Hook and Unhook from C# to enable and disable the function.

警告:我没有测试过此代码,并提供为。示范只

WARNING: I have not tested this code and is provided as a demonstration only.

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

这篇关于C#中:如何捕获全球鼠标/ HID事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆