快速提问 -
我正在阅读有关键盘钩子的信息,有人建议使用Raw Input执行此操作,但我找不到任何示例。 例如我正在使用
RAWINPUTDEVICE rid[1];
rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x06;
rid[0].hwndTarget = hWnd;
rid[0].dwFlags = 0;
RegisterRawInputDevices(rid, 1, sizeof(rid[0]));
并且在应用程序自己的窗口中使用WM_INPUT,但不在应用程序之外。这可能在应用程序之外,还是必须使用WH_KEYBOARD或WH_KEYBOARD_LL? MSDN没有说清楚Raw Input是否可以在全球范围内制作。
编辑:我知道Hooks,但我想知道你是否也可以使用Raw输入!干杯
答案 0 :(得分:7)
查看the MSDN documentation for that stuff,有一个名为RIDEV_INPUTSINK
的标记,其描述为:“如果设置,则即使呼叫者不在前台,也可以使呼叫者接收输入。” / p>
我自己并没有弄乱,但听起来它可能对从应用程序窗口之外获取输入很有用。
答案 1 :(得分:1)
这是我初始化RAW INPUT
以全局拦截鼠标和键盘事件的方法。与钩子相比的巨大优势是你不需要DLL。
您使用WM_INPUT
处理窗口过程中的原始输入事件。有关更多信息:RAW INPUT
#include <Windows.h>
const USHORT HID_MOUSE = 2;
const USHORT HID_KEYBOARD = 6;
bool HID_RegisterDevice(HWND hTarget, USHORT usage)
{
RAWINPUTDEVICE hid;
hid.usUsagePage = 1;
hid.usUsage = usage;
hid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
hid.hwndTarget = hTarget;
return !!RegisterRawInputDevices(&hid, 1, sizeof(RAWINPUTDEVICE));
}
void HID_UnregisterDevice(USHORT usage)
{
RAWINPUTDEVICE hid;
hid.usUsagePage = 1;
hid.usUsage = usage;
hid.dwFlags = RIDEV_REMOVE;
hid.hwndTarget = NULL;
RegisterRawInputDevices(&hid, 1, sizeof(RAWINPUTDEVICE));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
WNDCLASS wc;
...
RegisterClass(&wc);
HWND hwnd = CreateWindow(...);
...
HID_RegisterDevice(hwnd, HID_KEYBOARD);
HID_RegisterDevice(hwnd, HID_MOUSE);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
...
}
HID_UnregisterDevice(HID_MOUSE);
HID_UnregisterDevice(HID_KEYBOARD);
return (int) msg.wParam;
}
答案 2 :(得分:0)
不确定原始输入,但对于键盘钩子,一般你需要将它作为一个dll并在系统中注册,以便它将被每个进程加载。备注中的一些细节here
答案 3 :(得分:0)
Windows挂钩是一种可用于在事件到达应用程序之前拦截事件的机制。过滤功能(接收事件的功能)根据事件类型进行分类。如果想要附加到Windows挂钩,则必须使用SetWindowsHookEx
安装过滤器功能。我必须提到全局钩子必须在一个单独的dll文件中。您可以在MSDN中了解有关挂钩的更多信息。