键盘监控的实现Ⅲ——按键消息的修改(映射)

  在“键盘监控的实现Ⅰ——Keyboard Hook API函数”中,介绍了基本的Key Hook API函数

  在“键盘监控的实现Ⅱ——容易产生误解的CallNextHookEx函数”中,提到按键消息的修改是不能通过更改参数调用CallNextHookEx函数来实现的。

  本文就是要解决这个问题,如何来实现按键消息的修改。这里我们要引入一个函数

  Private Declare Sub keybd_event Lib "user32" (ByVal bvk As Byte, ByVal scan As Byte, ByVal dwflags As Integer, ByVal dwextrainfo As Integer)

  这个函数的目的是模拟按键消息,就像真的在点击键盘似的。

  keybd_event(Keys.Z, 0, 0, 0)  表示模拟按下Z键

  keybd_event(Keys.Z, 0, 2, 0)  表示模拟弹起Z键

 

  但是不管是真的点击键盘还是模拟按键消息。这个按键消息都会被我们的消息处理函数拦截到。我们该如何区分呢?

  先看看消息处理函数

  Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
    Dim MyKeyboardHookStruct As KeyboardHookStruct = DirectCast(Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct)), KeyboardHookStruct)

  

    自己处理的一些代码,例如:记录、屏蔽、映射等

 

    Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
  End Function

  由于安装的是WH_KEYBOARD_LL钩子。按键消息的详细信息是在lParam指向的KeyboardHookStruct中。故在上面的函数中,第一句就是获得该结构的详细信息。我们来看看该结构在MSDN中的解释

  Public Structure KeyboardHookStruct
    Dim vkCode As Integer
    Dim ScanCode As Integer
    Dim Flags As Integer
    Dim Time As Integer
    Dim DwExtraInfo As Integer
  End Structure

  其中各个参数意义如下:

    VkCode:按键的虚拟键码。键盘上的每个按键对应一个虚拟键码

    ScanCode:硬件的扫描码

    Flags:按键消息的详细信息。是一些标识位的组合

    Time:时间。

    DwExtraInfo:扩展到按键消息的信息

  参数Flags是一个八位的二进制,各个位的标识信息如下:

    0位:扩展键的标识位。1表示该键是扩展键;0表示不是。

    1位~3位:保留位,一般是0。

    4位:标识消息的类型,1表示该消息是模拟的;0表示该消息是真实的

    5位:Alt键的标识位。1表示Alt是按下的;0表示Alt键没有被按下

    6位:保留位,一般是0

    7位:按键的状态标识位。1表示按键是弹起的,0表示按键是按下的

 

  从上面的文字可以看出,在Flags参数中的第四位是能区分消息的类别的。当我们点击键盘的时候,这位是0,是真实的按键消息;当我们用keybd_event函数模拟按键消息时,这位是1。

 

  这下思路有了。我们在消息处理函数中,将模拟按键消息一律放过,只处理真实的按键消息。就能实现按键消息的修改(映射)。我们以例子来说明,键盘消息的修改,按下A,反馈的是Z。参看下面的函数

  Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
    Dim MyKeyboardHookStruct As KeyboardHookStruct = DirectCast(Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct)), KeyboardHookStruct)

    If (MyKeyboardHookStruct.Flags And 16) = 16 Then
      Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
    End If

    If MyKeyboardHookStruct.vkCode=Keys.A Then

      Dim KeyStatue As Integer=(MyKeyboardHookStruct.Flags And 128) / 64

      keybd_event(Keys.Z, 0, KeyStatue, 0)
      Return 1
    Else
      Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
    End If
  End Function

  函数的第一句是获得KeyboardHookStruct结构。后面一个判断是将模拟键盘消息放过。然后紧接着判断是否是A,若是A,则模拟键盘消息Z,并丢弃A这个消息;若不是,放过消息丢给后面的程序。这样一段代码就实现了对键盘消息的修改(映射),将A改成Z。当然,也能实现其他的键盘消息的映射。

时间: 2024-07-30 17:57:45

键盘监控的实现Ⅲ——按键消息的修改(映射)的相关文章

C#窗体中重写WndProc方法为什么可以截获鼠标单击消息,却不能截获键盘按键消息?

问题描述 如下,可以截获到鼠标单击消息:protectedoverridevoidWndProc(refMessagem){constintWM_MOUSEDOWN=0x0210;if(m.Msg==WM_MOUSEDOWN){MessageBox.Show(m.Msg.ToString());return;}base.WndProc(refm);}但如下,却不可以截获到键盘按键消息:protectedoverridevoidWndProc(refMessagem){constintWM_KEY

键盘监控的实现Ⅰ——Keyboard Hook API函数

在实际应用中,键盘监控是一种很常见的技术,它包括按键的记录.按键的过滤.按键的修改(映射)等.比方说,我们想统计用户的击键情况,这个就是按键的记录:我们想屏蔽某些系统键(例如Alt键.Win键),这个是按键的过滤:我们想改变按键的值,例如按下A,出来的是Z,在例如按下A,出来按键的组合SDFG等(貌似这个在游戏中比较多,有些游戏的大绝招都比较难按,用这个一劳永逸),这个是按键的修改. 键盘监控的具体实现,用的是微软的Keyboard Hook API函数. 首先解释下,什么是Hook函数. WI

python中使用pyhook实现键盘监控的例子_python

pyhook下载:http://sourceforge.net/projects/pyhook/files/pyhook/1.5.1/ pyhookAPI手册:http://pyhook.sourceforge.net/doc_1.5.0/ 以上网站上提供了几个使用的例子,另外安装pyhooks后,也会有一个例子的文件.于是拿来学习了一下,第一次运行时,提示没有pythoncom模块,就安装了pywin32,安装后,可以正常运行,但是会导致机器发卡,特别是中断程序运行后,鼠标会出现一段时间的自由

如何检测新键盘有没有坏按键

  键盘是最常用也是最主要的输入设备,通过键盘可以将英文字母.数字.标点符号等输入到计算机中,从而向计算机发出命令.输入数据等.所以键盘上的按键非常重要. 如何检测新键盘有没有坏按键? 1.在百度中输入"键盘按键检测"----搜索.会出现很多结果. 2.在搜索结果中随意找一个进行下载安装,有的不需要安装,直接可以用. 3.然后进行按键检测,你按过的键会有颜色上的变化.也可以采用重点排查的方式检测你认为可能坏的键盘. 4.好了.通过这种简单的方式你就可以检测你的键盘按键是否有坏掉的了,解

句柄指针-给SAP发送按键消息 c++

问题描述 给SAP发送按键消息 c++ HWND hWnd = ::FindWindow(L"SAP_FRONTEND_SESSION", NULL); CWnd* hEditEx= CWnd::FindWindowExW(hWnd,NULL, L"Afx:63DE0000:1008",NULL); HWND hEdit=hEditEx->GetSafeHwnd(); ::PostMessage(hEdit, WM_CHAR,0x31,0);//发送 上面这种

JS实现获取键盘按下的按键并显示在页面上的方法_javascript技巧

本文实例讲述了JS实现获取键盘按下的按键并显示在页面上的方法.分享给大家供大家参考,具体如下: 请你使用键盘输入一些字符,这些字符就被显示在网页的空白处,是不是少了文本框或文本域之类的东西,觉得挺不习惯呢?这个效果是应用了JavaScript中的document.onkeypress对象,监测键盘的一举一动,并记录下哪些键被按下,有意思吧,想研究Js的朋友,就从这些小例子开始吧. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-web-sh

怎样模拟发送游戏手柄的按键消息?

问题描述 怎样模拟发送游戏手柄的按键消息?在网络上搜索了一圈,只看到获取消息的,没看到模拟发送消息的. 解决方案 解决方案二:没人知道么?

mfc按键消息的响应问题

问题描述 mfc按键消息的响应问题 我在mfc但文本对话框工程中添加了按键消息响应,可是当按键消息过快时,我的数据更新,而定时器作图会丢掉一块数据的绘制,以至于绘图产生空缺,要怎么解决 解决方案 定时器消息本来就优先级比较低,当消息队列满了以后,就会丢弃定时器消息. 你只能降低绘图的频率 解决方案二: 首先,提问请不要急,将问题描述清楚. 按键过块,会影响绘制?你能按多快啊!你绘制时,是否使用了双缓冲,每次重绘制全屏,这样就不会出现你所说的问题.但这样需要保存所有数据! 解决方案三: 顶楼上,采

ndroid 安全-Android accessibility 键盘监控 界面变化

问题描述 Android accessibility 键盘监控 界面变化 最近在研究Georgia理工的一篇论文,论文中,他们开发了一个app,那个app能够覆盖 在目标app上,并且模仿目标app的界面,这样,用户会在我伪装的app中进行输入操作, 从而监控到用户的所有输入和动作,再通过Android accessibility api来将用户的操作输入 到目标app中,从而实现继续监控 关于Android accessibility来讲用户操作输入到目标app已经实现了,但是模仿目标app