所有键盘鼠标模拟方式原理及实现

您所在的位置:网站首页 按键精灵鼠标模拟方式 所有键盘鼠标模拟方式原理及实现

所有键盘鼠标模拟方式原理及实现

2024-06-26 20:03| 来源: 网络整理| 查看: 265

前言:

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

 

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

一   消息模拟

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

看看要用到的API

// 发送消息到指定窗口,不用等待消息处理就返回,参数和窗口过程里的一样 BOOL WINAPI PostMessage(   _In_opt_ HWND   hWnd,   _In_     UINT   Msg,   _In_     WPARAM wParam,   _In_     LPARAM lParam ); // 获取窗口句柄,参数是窗口类名和窗口标题,其中一个可以传入NULL表示通配 HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName ); // 用来获取子窗口句柄 HWND WINAPI FindWindowEx( _In_opt_ HWND hwndParent, _In_opt_ HWND hwndChildAfter, _In_opt_ LPCTSTR lpszClass, _In_opt_ LPCTSTR lpszWindow );

以记事本为例子

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

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

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

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

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

HWND notepadWnd = FindWindow(_T("Notepad"), NULL); // 记事本窗口句柄 if (notepadWnd == NULL) { printf("没有找到记事本窗口\n"); return 0; } HWND editWnd = FindWindowEx(notepadWnd, NULL, _T("Edit"), NULL); // 编辑框窗口句柄 const BYTE vk = 'A'; // 虚拟键码 //UINT scanCode = MapVirtualKey(vk, MAPVK_VK_TO_VSC); // 扫描码 PostMessage(editWnd, WM_KEYDOWN, vk, 1 /*| scanCode


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3