// 取坐标处窗口句柄
HWND WINAPI WindowFromPoint(
_In_ POINT Point
// 取鼠标坐标
BOOL WINAPI GetCursorPos(
_Out_ LPPOINT lpPoint
// 把屏幕坐标转为相对于窗口客户区的坐标
BOOL ScreenToClient(
_In_ HWND hWnd,
LPPOINT lpPoint
模拟鼠标右键点击的程序
Sleep(3000); // 等待3秒把鼠标移到指定窗口
POINT pos; // 鼠标坐标
GetCursorPos(&pos);
HWND wnd = WindowFromPoint(pos); // 鼠标指向的窗口的句柄
ScreenToClient(wnd, &pos); // 把pos转成相对于窗口客户区的坐标
LPARAM lParam = MAKELPARAM(pos.x, pos.y);
PostMessage(wnd, WM_RBUTTONDOWN, 0, lParam);
Sleep(100);
PostMessage(wnd, WM_RBUTTONUP, 0, lParam);
运行后把鼠标移到记事本,会弹出菜单
发送消息模拟输入的方法好处是就算窗口最小化了也可以模拟,但是缺点是不是所有程序都会处理窗口消息,比如大部分游戏是用DInput输入的
API模拟
API模拟就是用Windows提供的API模拟输入,比如keybd_event、mouse_event、SendInput,但是微软建议用SendInput代替另外两个,那我就只讲SendInput怎么用了
用到的API
UINT WINAPI SendInput(
_In_ UINT nInputs,
_In_ LPINPUT pInputs,
_In_ int cbSize
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
} INPUT, *PINPUT;
这个API可以模拟键盘按下、鼠标移动、鼠标点击等事件,参数是INPUT结构的数量、INPUT数组的指针、INPUT结构的大小
INPUT中type取值为INPUT_MOUSE、INPUT_KEYBOARD、INPUT_HARDWARE,分别表示使用mi、ki、hi结构
详细说明请看MSDN:
MOUSEINPUT
KEYBDINPUT
模拟鼠标移动到屏幕中间点击右键
INPUT input[3];
ZeroMemory(&input, sizeof(input));
// 鼠标移动到屏幕中间,也可以用SetCursorPos(x, y)
input[0].type = INPUT_MOUSE;
input[0].mi.dx = 65535 / 2; // 坐标取值范围是0-65535
input[0].mi.dy = 65535 / 2;
input[0].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;
// 点击鼠标右键
input[1].type = INPUT_MOUSE;
input[1].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
input[2].type = INPUT_MOUSE;
input[2].mi.dwFlags = MOUSEEVENTF_RIGHTUP;
SendInput(_countof(input), input, sizeof(INPUT));
模拟按下A键:
INPUT input[2];
ZeroMemory(&input, sizeof(input));
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = 'A';
// 也可以不加这句但是对DInput输入的程序会没用
input[0].ki.wScan = MapVirtualKey(input[0].ki.wVk, MAPVK_VK_TO_VSC);
input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = input[0].ki.wVk;
input[1].ki.wScan = input[0].ki.wScan;
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(_countof(input), input, sizeof(INPUT));
来个高级点的例子:东方花映冢Z键连打
东方花映冢里想发轻弹幕就要不停按Z键,这样很费劲,所以我想实现按住C键就能自动发轻弹幕的功能(就像妖精大战争那样)
这个程序用到了MFC,看不懂的话建议学一下MFC编程
// 开启
void CC2ZDlg::OnBnClickedButton1()
m_enableButton.EnableWindow(FALSE);
m_disableButton.EnableWindow(TRUE);
SetTimer(1, 200, timerProc); // 每0.2s检测C键是否按下,并模拟Z键
// 关闭
void CC2ZDlg::OnBnClickedButton2()
m_enableButton.EnableWindow(TRUE);
m_disableButton.EnableWindow(FALSE);
KillTimer(1);
//定时模拟按下Z
void CALLBACK CC2ZDlg::timerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
if ((GetKeyState('C') & (1 << 15)) != 0) // C键按下
INPUT input;
ZeroMemory(&input, sizeof(input));
input.type = INPUT_KEYBOARD;
input.ki.wVk = 'Z';
input.ki.wScan = MapVirtualKey(input.ki.wVk, MAPVK_VK_TO_VSC);
SendInput(1, &input, sizeof(INPUT)); // 按下Z键
Sleep(100); // 可能东方是在处理逻辑时检测一下Z键是否按下才发弹幕,如果这时Z键刚好弹起就没有反应,所以要延迟一下
input.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &input, sizeof(INPUT)); // 弹起Z键
这样就可以模拟大部分游戏的输入了,但是有些游戏会有保护,这样就要用到驱动模拟
驱动模拟就是自己写驱动程序,在系统内核里面操作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++目录,包含目录加上Interception\library,库目录根据目标系统是64位还是32位加上library\x64或library\x86
找到链接器-输入,附加依赖项加上interception.lib
然后把library\x64或library\x86里的interception.dll放到你的程序同目录下
最后在你的源码里#include <interception.h>
模拟鼠标移动到屏幕中间点击右键:
InterceptionContext context = interception_create_context();
InterceptionMouseStroke mouseStroke[3];
ZeroMemory(mouseStroke, sizeof(mouseStroke));
// 鼠标移动到屏幕中间
mouseStroke[0].flags = INTERCEPTION_MOUSE_MOVE_ABSOLUTE;
mouseStroke[0].x = 65535 / 2; // 坐标取值范围是0-65535
mouseStroke[0].y = 65535 / 2;
// 点击鼠标右键
mouseStroke[1].state = INTERCEPTION_MOUSE_RIGHT_BUTTON_DOWN;
mouseStroke[2].state = INTERCEPTION_MOUSE_RIGHT_BUTTON_UP;
interception_send(context, INTERCEPTION_MOUSE(0), (InterceptionStroke*)mouseStroke, _countof(mouseStroke));
interception_destroy_context(context);
模拟按下A键:
InterceptionContext context = interception_create_context();
InterceptionKeyStroke keyStroke[2];
ZeroMemory(keyStroke, sizeof(keyStroke));
keyStroke[0].code = MapVirtualKey('A', MAPVK_VK_TO_VSC);
keyStroke[0].state = INTERCEPTION_KEY_DOWN;
keyStroke[1].code = keyStroke[0].code;
keyStroke[1].state = INTERCEPTION_KEY_UP;
interception_send(context, INTERCEPTION_KEYBOARD(0), (InterceptionStroke*)keyStroke, _countof(keyStroke));
interception_destroy_context(context);
驱动模拟很强大,不过比较麻烦,一般也用不到_(:з」∠)_
现在应该大部分人都使用win11系统吧,不用也要强行给你更新到win11,win11其实挺好用哈,只是有一点不好用,就是右键的菜单,今天做个小程序,就是应该修改win11的一个应用程序
先来看一段视频哈!
windows11修改器
上半年疫情在家的时候实在无聊,文艺复兴,把PVZ几个版本又玩了一遍,本来打算写个修改器,结果鸽到现在因为各种事情耽搁到现在。以后有时间就尽量更新,估计这个系列要写很久
另:PVZ各版本合集搜“植物大战僵尸相关”就可以找到(还是西游版和β版本好玩。
和网上大部分教程一样,本文也是通过CE寻找阳光基址,然后用C语言实现阳光数量的修改。
一、CE寻找阳光基址
CE还算是蛮有意思的一个软件,有兴趣学习CE使用方法的同学,可以在B站搜CE嗨入门,不过重点还是要动手去实践。
用CE寻找阳光基址的方法有很多
注意:不支持Windows 8 / 8.1。
Interceptor是Windows键盘驱动程序的包装器(包装http://oblita.com/Interception)。
使用驱动程序,Interceptor可以模拟按键和鼠标点击...
使用DirectX的游戏,通常不接受使用SendInput()的击键
Windows的受保护区域,如Windows登录屏幕或UAC调暗屏幕
任何应用程序
因为驱动程序模拟击键和鼠标单击,所以目标窗口必须处于活动状态(即,在发送击键和鼠标点击时,不能在另一个窗口上执行多任务)。
下载并构建此项目并在项目中引用其DLL。
下载'interception.dll',这是一个由驱动程序作者编写的独立库。将它放在与可执行文件相同的目录中。这是必需的。
从作者的网页下载并安装“install-interception.exe”。安装后重新启动计算机。
在您的代码中,要加载驱动程序,请调用(阅读下面的代码注释;您必须设置过滤模式以捕获按键事件或发送按键操作!):
Input input = new Input();
// Be sure to set your keyboard filter to be able to capture key presses and simulate key presses
// KeyboardFilterMode.All captures all events; 'Down' only captures presses for non-special keys; 'Up' only captures releases for non-special keys; 'E0' and 'E1' capture presses/releases for special keys
input.KeyboardFilterMode = KeyboardFilterMode.All;
// You can set a MouseFilterMode as well, but you don't need to set a MouseFilterMode to simulate mouse clicks
// Finally, load the driver
input.Load();
做你的东西。
input.MoveMouseTo(5, 5); // Please note this doesn't use the driver to move the mouse; it uses System.Windows.Forms.Cursor.Position
input.MoveMouseBy(25, 25); // Same as above ^
input.SendLeftClick();
input.KeyDelay = 1; // See below for explanation; not necessary in non-game apps
input.SendKeys(Keys.Enter); // Presses the ENTER key down and then up (this constitutes a key press)
// Or you can do the same thing above using these two lines of code
input.SendKeys(Keys.Enter, KeyState.Down);
Thread.Sleep(1); // For use in games, be sure to sleep the thread so the game can capture all events. A lagging game cannot process input quickly, and you so you may have to adjust this to as much as 40 millisecond delay. Outside of a game, a delay of even 0 milliseconds can work (instant key presses).
input.SendKeys(Keys.Enter, KeyState.Up);
input.SendText("hello, I am typing!");
/* All these following characters / numbers / symbols work */
input.SendText("abcdefghijklmnopqrstuvwxyz");
input.SendText("1234567890");
input.SendText("!@#$%^&*()");
input.SendText("[]\\;',./");
input.SendText("{}|:\"?");
// And finally
input.Unload();
BadImageFormatException如果您没有为解决方案中的所有项目(包括此项目)使用正确的体系结构(x86或x64),则可能会获得。因此,您可能必须下载此项目的源代码才能将其重建为正确的体系结构。这应该很简单,构建过程应该没有错误。
您必须从http://oblita.com/Interception下载'interception.dll' 。
如果你已经完成了以上所有操作(正确安装了拦截驱动程序,将interception.dll放在你的项目文件夹中),你仍然无法发送击键:
驱动程序有一个限制,即它不能在不接收至少一次击键的情况下发送击键。这是因为驱动程序不知道键盘是哪个设备ID,因此它必须等待接收击键以从击键中推断出设备ID。
总之,在发送击键之前,请始终按键盘一次。点按任意键。然后你可以发送击键。这不适用于接收击键,因为通过接收击键,您当然已经按下了一个键。
MoveMouseTo()和MoveMouseBy()完全忽略键盘驱动程序。它使用System.Windows.Forms.Position来设置和获取游标的位置(它为下面的各个函数调用标准的Win32 API)。
原因是,在探索键盘驱动程序的鼠标移动功能时,我注意到它没有按像素单位移动光标,而是似乎通过加速移动光标。当我想将光标移动到某个位置时,这会不断产生不一致的值。因为Win32游标设置API通常不被游戏等阻止,所以我发现只需调用这些标准API即可,而无需使用驱动程序。请注意,这仅适用于设置光标位置。拦截光标仍然可以正常工作。例如,您可以使用Interceptor反转鼠标的x和y轴。
关于怎样写植物大战僵尸
游戏修改器的详细过程,在手把手教你写
游戏修改器里面已经详细介绍了,这里就不再说了。前面那个
修改器是基于控制台程序下面的,紧紧对于植物大战僵尸有用,采用上面那个
教程已经将
游戏修改器的
制作流程和原理讲清楚了,现在我们开始做一个完整的
游戏修改器。
1、建立一个对话框工程,建立过程VC怎样建立对话框工程中已经介绍了。这里不再介绍
2、绘制如下界面
其中个控件ID如下:
本文转自:http://www.cr173.com/html/25917_all.html
Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。VS
2013 中新增了很多提高开发人员工作效率的新功能,比如自动补全方括号、使用快捷键移动整行或整块的代码等;
相信很多小伙伴在刚开始学习时都遇到了这样的困难,好不容易下载好了软件,却不知道该怎么使用,怎么去创建自己的第一个项目。本文将详细介绍如何使用Visual Studio 2013创建一个c程序,一起往下看看吧。
二.创建步骤
1.打开Visual Studio 2013软件。
2.点击左上角菜单栏的【文件】,点击【新建】,点击【项目】。
3.弹出如下窗口,首先选择【Win32 控制台应用程序】,然后修改...
1、导入库Cocos2dx其他库http://www.bubuko.com/infodetail-397049.html
2、格式化部分代码:选中代码Ctrl+K,F或者Ctrl+E,F
格式化整个文档:编辑->高级->设置文档的格式。或者ctrl+k+d或者Ctrl+E,D自动调整代码格式
3、Peek View
可以在不新建TAB的情况下快速查看、编辑一个函数的代码。
用法:在光标移
Windows编程捕获特定窗口及键盘鼠标消息模拟一、简介二、使用到的API简介三、获取Windows记事本的编辑区窗口的句柄并模拟输入操作1、分析2、代码一3、代码二四、后记
窗口是Windows的核心组件,Windoows下的绝大部分应用都是利用Windows提供的原生窗口,通过一些GUI编程框架(如Qt,MFC)加以渲染来生成的。本质上讲,这些框架都是基于Windows提供的一些AP...
champkeh:
游戏修改器制作教程四:用API读写内存
社恐不参团:
游戏修改器制作教程一:键盘鼠标模拟
社恐不参团: