获取接盘输入

最彻底的是钩子,能获取、拦截系统的消息,包括按键输入消息。

最常用的是重载PreTranslateMessage,只获取拦截本程序本窗口的消息。例如:

BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{// TODO: 在此添加专用代码和/或调用基类if (pMsg->message == WM_KEYDOWN){switch (pMsg->wParam){case VK_RETURN: // 屏蔽回车return TRUE;case VK_ESCAPE:if (IDCANCEL == AfxMessageBox(_T("exit?"), MB_OKCANCEL))return TRUE;break;default:break;}}return CDialogEx::PreTranslateMessage(pMsg);
}

但是一般的该重载,当本窗口不在焦点,或者焦点在editcontrol等编辑控件上时,无法拦截到。此时可以使用rawinput

rawinput使用之前需要先注册,例如:

    RAWINPUTDEVICE rawinputdevice[1];rawinputdevice[0].usUsagePage = 0x01; // Generic Desktop Controlsrawinputdevice[0].usUsage = 0x06;    // Keyboardrawinputdevice[0].dwFlags = RIDEV_INPUTSINK;// If set, this enables the caller to receive the input even when the caller is not in the foreground. Note that hwndTarget must be specified. rawinputdevice[0].hwndTarget = AfxGetMainWnd()->m_hWnd;BOOL ret = RegisterRawInputDevices(&rawinputdevice[0], 1, sizeof(RAWINPUTDEVICE));if (ret == FALSE){AfxMessageBox(_T("RegisterRawInputDevices return FALSE!"));exit(0);}

其中usUsagePage和usUsage用于指定需要获取的设备,参考:

usUsagePage

键盘、鼠标都是取0x01

usUsage

鼠标是0x02,键盘是0x06

rawinput入口

1. 重载主窗口的WM_INPUT消息获得OnRawInput

2. 重载 PreTranslateMessage,在函数里面判断pMsg->message 是否是 WM_INPUT

一般重载主窗口的WM_INPUT消息比较方便,OnRawInput的处理示例:

void CxxxDlg::OnRawInput(UINT nInputcode, HRAWINPUT hRawInput)
{// 该功能要求使用 Windows XP 或更高版本。// 符号 _WIN32_WINNT 必须 >= 0x0501。// TODO: 在此添加消息处理程序代码和/或调用默认值CString sInfo = _T("");UINT uiSize = 0;GetRawInputData((HRAWINPUT)hRawInput, RID_INPUT, NULL, &uiSize, sizeof(RAWINPUTHEADER));LPBYTE pData = new BYTE[uiSize];if (GetRawInputData((HRAWINPUT)hRawInput, RID_INPUT, pData, &uiSize, sizeof(RAWINPUTHEADER)) != uiSize) //获取消息信息{sInfo = _T("GetRawInputData error!\r\n");GetDlgItem(IDC_STATIC_INFO)->SetWindowText(sInfo);}else{RAWINPUT* pRawinput = (RAWINPUT*)pData;if (pRawinput->header.dwType == RIM_TYPEKEYBOARD){// 获取设备名(设备路径),可用于区分输入的键盘GetRawInputDeviceInfo(pRawinput->header.hDevice, RIDI_DEVICENAME, NULL, &uiSize);TCHAR sBuffer[1024] = { 0 };GetRawInputDeviceInfo(pRawinput->header.hDevice, RIDI_DEVICENAME, sBuffer, &uiSize);sInfo += _T("device name:");if (uiSize > 0)sInfo += sBuffer;// 获取键盘输入if (pRawinput->data.keyboard.Message == WM_KEYDOWN){TCHAR sAscii[10] = { 0 };BYTE sKeyState[256] = { 0 };sInfo += _T("\r\ninput:");if (ToAscii(pRawinput->data.keyboard.VKey, pRawinput->data.keyboard.MakeCode, sKeyState, (LPWORD)sAscii, 0))sInfo += sAscii;AfxMessageBox(sInfo);}}}delete[] pData;pData = nullptr;CDialogEx::OnRawInput(nInputcode, hRawInput);
}

示例

MFC学习 —— 使用RawInput获取键盘输入相关推荐

  1. Go 获取键盘输入,进制转换

    #### Go 获取键盘输入,进制转换 最近爱上<<珂矣的心灵独语>> 连续听一下礼拜也不觉得厌: 喜欢她的宁静与安然,喜欢她的坦荡与欢喜,喜欢她的禅意与智慧; ***撑着一苇 ...

  2. python 获取键盘输入、同时有超时的功能_python 获取键盘输入,同时有超时的功能示例...

    如下所示: ''' ###get keyboard input and timeout =5 import sys, time, msvcrt def readInput( caption, defa ...

  3. C++关于利用_kbhit()函数持续获取键盘输入的一点心得。

    #C++关于利用_kbhit()函数持续获取键盘输入的一点心得. 小白路过想写个贪吃蛇玩玩,当用链表把贪吃蛇结构连起来后自然就想到了移动控制的问题.写来写去代码总是出错,贪吃蛇只有一直按着方向键才能移 ...

  4. GetAsyncKeyState()函数获取键盘输入

    C++ GetAsyncKeyState()函数获取键盘输入 GetAsyncKeyState()可以异步获取按键输入,GetAsyncKeyState(某个键的虚拟键码) 可以得到这个键的状态,然后 ...

  5. python获取键盘输入_Python 3 学习笔记之——键盘输入和读写文件

    1. 键盘输入 Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘.input 可以接收一个 Python 表达式作为输入,并将运算结果返回. str = inp ...

  6. python获取键盘输入能不能不按回车键_Github获8300星!用Python开发的一个命令行的网易云音乐...

    最近在逛Github发现了一个非常有趣的库musicbox,是用纯Python打造的,收获了8300颗星.Python语言简单易学,好玩有趣,身边越来越多的小伙伴都开始学习Python.她的魅力非常大 ...

  7. python获取键盘输入_python之判断数据异常Python读取键盘输入

    Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: <python之判断数据异常Python读取键盘输入>总结了关于python网站教程,对于我们来www. ...

  8. 聚焦到Windows的窗口,激活窗口获取键盘输入,不需要鼠标点击,C++接口,focus, active, foreground

    情景 假设windows上开了2个窗口,分别叫WinA和WinB: 点击WinB后,WinA失去焦点,但我想让WinA获得焦点,获得键盘输入. 做法: 1.激活WinA 2.让WinA置于前面 3.聚 ...

  9. linux的shell键盘输入,linux shell获取键盘输入

    linux shell从键盘获取输入 代码1: #!/bin/bash #提示"Input your choice:",把用户的输入保存入变量choice_user中 read - ...

最新文章

  1. 工作后,拉开你和同龄人差距的,不是出身,不是努力,而是……
  2. 网站优化中需要关注哪些对网站排名有关的内容呢?
  3. 使用SmsManager服务群发短信
  4. 评估微型计算机的主要指标,微型计算机的工作过程和主要性能指标.doc
  5. Unicode的一些类型转换问题
  6. leetcode 179. 最大数(排序)
  7. 九江机器人餐厅_机器人精通200道佳肴 九江学院来了多位机器厨神
  8. jQuery心得5--jQuery深入了解串讲1
  9. 使用 spring-boot 的 RabbitMQ 范例测试我的 RabbitMQ 服务器
  10. 龙芯机器联网时,链接建立速度有点慢
  11. 基于springboot在线租车管理系统
  12. django3.1发送邮件指定html正文:content_subtype = “html“
  13. python 输出圆的面积公式_python计算圆的面积
  14. 架构师必备!看我如何一步一步攻克面试官,详细解说
  15. 成都中医药大学计算机基础试题,成都中医药大学2016年春季学期期末考试计算机基础-成教()解剖.doc...
  16. 「话题」为什么微信、钉钉撤回消息的时限不同?小米200万改LOGO值不值?
  17. 有关Shiro中Principal的使用
  18. mac修改mysql密码(亲测)
  19. M1卡区块控制位详解
  20. web.g.cs_我没有CS学位而从零开始成为Web开发人员的旅程(以及我从中学到的东西......

热门文章

  1. 开源流程引擎Snaker
  2. gtasa服务器文件,GTASA详细解析文件
  3. 我的第一张网页-HTML入门教程
  4. 996,马云,刘强东
  5. 流水的科技股,铁打的PS、Flash亲爹Adobe
  6. java 量化交易系统_用java做量化
  7. 计算机组成原理之总线设计
  8. 弱网下的极限实时视频通信
  9. GitHub:Python面试题
  10. 流程控制(内含scanner、if语句、switch语句、while和for循环)