RegisterRawInputDevices捕获设备消息
来源:互联网 发布:里约奥运会数据库 编辑:程序博客网 时间:2024/05/20 20:47
通常我们运用钩子(hook)捕获消息,其实windows还给我们提供了其他方法捕获系统设备消息。
今天我们就利用RegisterRawInputDevices 来捕获设备消息。
以Win32程序为例: 首先注册设备RegisterRawInputDevices, 然后在消息循环中 添加WM_INPUT 的消息处理函数, 用GetRawInputData转换参数。
注册设备
先要包含头文件Winuser.h 和 动态库User32.lib。
RegisterRawInputDevices函数说明:
BOOL WINAPI RegisterRawInputDevices( _In_ PCRAWINPUTDEVICE pRawInputDevices, //设备信息数组,可包含多种设备 _In_ UINT uiNumDevices, //pRawInputDevices数组 的大小,即设备种类 _In_ UINT cbSize //sizeof(RAWINPUTDEVICE));
现在对RAWINPUTDEVICE结构体进行简单说明:
typedef struct tagRAWINPUTDEVICE { USHORT usUsagePage; //usUsagePage 和 usUsage 确定设备种类 USHORT usUsage; DWORD dwFlags; //指定发送消息的方式 HWND hwndTarget; //接受WM_INPUT消息的窗口句柄,如果是NULL,接受消息窗口就跟随键盘焦点} RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;
dwFlags 用很多种标志,这里通常用的是RIDEV_INPUTSINK, 表示不论接受窗口是否获得焦点,设备消息都发送给该窗口。这种情况hwndTarget必须指定。
鼠标标志为:usUsagePage = 0x01, usUsage=0x02.
键盘标志位:usUsagePage = 0x01, usUsage=0x06.
示范:
BOOL RegisitKeyBord(HWND hwnd){ if (NULL == hwnd) return false RAWINPUTDEVICE rid; //设备信息 rid.usUsagePage = 0x01; rid.usUsage = 0x06; //键盘 rid.usUsagePage = 0x01; rid.usUsage = 0x02; 为鼠标 rid.dwFlags = RIDEV_INPUTSINK; rid.hwndTarget = hwnd; return RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));}
获取消息
在完成注册后,我们需要在窗口消息循环中添加处理函数;
一般Win32程序,在WndProc中添加:
case WM_INPUT:{ GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); //先获取数据大小dwSize LPBYTE lpb = new BYTE[dwSize]; //根据大小 创建 if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize) //获取消息信息 break; RAWINPUT *raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEKEYBOARD /*&& raw->data.keyboard.Flags == RI_KEY_MAKE*/) //注释掉的部分 用来判断 按键是否是按下 { //这里添加 消息处理函数 int y = raw->data.keyboard.VKey; //按键 键值 int x = 1; } delete[] lpb; DefWindowProc(hWnd, message, wParam, lParam);}
完成。
阅读全文
0 0
- RegisterRawInputDevices捕获设备消息
- 怎么捕获非标准usb设备插入或拔出消息?
- Dshow 捕获设备数据
- 捕获Esc按键消息
- 捕获按键消息
- wxPython 捕获按键消息
- C#捕获消息
- VC捕获键盘消息
- 捕获控制台程序的消息
- 用SetCapture捕获鼠标消息
- Qt中捕获Windows消息
- 关于捕获消息的方法
- wxPython如何捕获键盘消息
- 在主程序中捕获消息
- 捕获异常消息Ctrl+C
- UVC协议USB视频捕获设备定义
- 【FFMPEG】FFMPEG程序捕获Mac设备流媒体
- UVC协议USB视频捕获设备定义
- oracle 查询按年、月份,季度,周分组
- 《Hadoop基础教程》之初识Hadoop
- 单例模式
- 转自: Vue.js——60分钟组件快速入门(上篇)
- redis集群与哨兵模式安装
- RegisterRawInputDevices捕获设备消息
- KAFKA 0.11 RHEL6.5安装
- 怎样烧录WiFi攻击神器
- SpringMvc日期转换的三种方式
- Android Retrofit 2实现原理分析
- IntelliJ IDEA 2017.X破解
- 在windows系统下直接将linux系统删除导致开机出现grub rescure而无法进入windows系统的修复方法
- /*Oracle基础(创建表空间、创建用户、授予权限、撤销权限、更改删除接锁用户)*/
- 作业7.19