2025年xmouse(XMouseButtonControl模拟按键)

xmouse(XMouseButtonControl模拟按键)前言 有一些使用 DirectX 接口的游戏程序 它们在读取键盘操作时绕过了 windows 的消息机制 而使用 DirectInput 这是因为有些游戏对实时性控制的要求比较高 比如赛车游戏 要求以最快速度响应键盘输入 而 windows 消息由于是队列形式的 消息在传递时会有不少延迟 有时 1 秒钟也就传递十几条消息 这个速度达不到游戏的要求 而 DirectInput 则绕过了 windows 消息

大家好,我是讯享网,很高兴认识大家。



前言:

有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。

 

先从最简单的模拟操作讲起
模拟键盘鼠标有很多方法,我大体分为消息模拟、API模拟、驱动模拟
对于网页的话还可以用JavaScript模拟,虽然这不在本教程范围

学习Windows编程都知道Windows程序会响应窗口消息,那么我们自己发个消息过去程序就会认为是人在操作而响应了

看看要用到的API

 
  
讯享网

以记事本为例子

首先要知道记事本的窗口类名

打开记事本,打开VS2013,在工具里找到spy++

讯享网

在工具条找到查找窗口,把查找程序工具拖到记事本窗口,得到了记事本窗口的类名"Notepad"

同理可以知道编辑框的类名是Edit

我们写个程序模拟在编辑框按下A健

讯享网

运行程序,看看记事本里是不是多了个a

 

再写个程序模拟点击鼠标右键

用到的新API

 

模拟鼠标右键点击的程序

讯享网 
 

运行后把鼠标移到记事本,会弹出菜单

 

发送消息模拟输入的方法好处是就算窗口最小化了也可以模拟,但是缺点是不是所有程序都会处理窗口消息,比如大部分游戏是用DInput输入的

API模拟就是用Windows提供的API模拟输入,比如keybd_event、mouse_event、SendInput,但是微软建议用SendInput代替另外两个,那我就只讲SendInput怎么用了

用到的API

讯享网
这个API可以模拟键盘按下、鼠标移动、鼠标点击等事件,参数是INPUT结构的数量、INPUT数组的指针、INPUT结构的大小 

INPUT中type取值为INPUT_MOUSE、INPUT_KEYBOARD、INPUT_HARDWARE,分别表示使用mi、ki、hi结构

详细说明请看MSDN:
MOUSEINPUT
KEYBDINPUT

模拟鼠标移动到屏幕中间点击右键

讯享网

模拟按下A键:

 

来个高级点的例子:东方花映冢Z键连打

东方花映冢里想发轻弹幕就要不停按Z键,这样很费劲,所以我想实现按住C键就能自动发轻弹幕的功能(就像妖精大战争那样)

这个程序用到了MFC,看不懂的话建议学一下MFC编程

讯享网

完整源码

这样就可以模拟大部分游戏的输入了,但是有些游戏会有保护,这样就要用到驱动模拟

驱动模拟就是自己写驱动程序,在系统内核里面操作I/O端口,给连接键盘的集成电路(一般是8042芯片)发送指令,让它产生一个按下按键的信息,这样你的模拟输入对于所有程序来说就是从一个真实的设备发出的,而且可以绕过很多保护
(需要操作I/O端口的话可以学习一下WinIo库)
然而我并不会写这种驱动(:з」∠),而且x64系统中加载驱动需要有可信任的数字签名,否则会比较麻烦,而且还要知道8042芯片相关的底层知识…
所以我找了个别人写的库实现驱动模拟
Interception官网
Interception API的Git库




它的驱动有数字签名而且在XP到win10的平台上都测试过了
它还可以拦截并修改输入(包括CTRL+ALT+DELETE),不过这里我只讲模拟输入所以自己研究吧…
(好像它的模拟输入也不是操作端口而是内核版的SendInput?)

安装方法:

(可以去我的网盘)下载Interception.zip,解压后运行install-interception.exe

环境搭建:如果目标系统是64位的要先在配置管理器里加入x64配置

在你的项目属性里找到VC++目录,包含目录加上Interceptionlibrary,库目录根据目标系统是64位还是32位加上libraryx64或libraryx86
找到链接器-输入,附加依赖项加上interception.lib
然后把libraryx64或libraryx86里的interception.dll放到你的程序同目录下
最后在你的源码里#include <interception.h>


模拟鼠标移动到屏幕中间点击右键:

 
讯享网

模拟按下A键:

 

 

驱动模拟很强大,不过比较麻烦,一般也用不到(:з」∠)

 

 

参考:https://www.cnblogs.com/Jnshushi99/archive/2011/09/03/2164617.html


小讯
上一篇 2025-06-11 11:46
下一篇 2025-06-12 12:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/189870.html