关于远程控制鼠标和键盘的那些事 远程控制鼠标按键
liebian365 2024-10-30 04:50 23 浏览 0 评论
关于远程控制鼠标和键盘的那些事
在我们使用远程电脑控制软件时候,见得最多的除了画面,就是鼠标和键盘的操作了,那些远程控制的软件是如何工作的呢?经过与秒点远程控制工程师的深入交流,小编今天给大家讲讲其中原理。
其实远程控制软件的工作原理就是:A端操作,然后通过网络传输到B端,B端收到消息后做出相应的动作;然后动作的结果再通过画面形式传输回A端显示出来。今天我们就来讲讲鼠标和键盘在windows下远程控制的实现。有多种方法可以实现鼠标和键盘模拟,我们就介绍几种比较典型的。
1、局部级模拟
局部级模拟就是鼠标键盘事件只能把消息发送到指定的窗口。那么它是如何工作的呢?最直接的方法就是:直接伪造一个键盘消息发给目标程序。Windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和PostMessage,它们的区别就是PostMessage函数异步的消息丢给目标程序后就不管了,而SendMessage同步的消息发出去后,还要等待目标程序的返回结果,如果一直没有结果返回,就会阻塞在那里,导致线程阻塞。所以模拟鼠标键盘消息最好是用PostMessage函数是比较好的选择。
但是,PostMessage这个方法发送消息,要事先知道对方的窗口句柄。要知道对方的窗口句柄就要使用到另外一函数,那就是FindWindow来查找目标窗口。HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);这个方法FindWindow局限性比较大,就是要事先知道这个窗口的类名或者窗口名。在远程控制过程中我们要对不同的窗口做控制,而且还要知道这个窗口的信息才能有针对性的发消息才行。所以这不是一个很好的方案。这种方法以只适合做一些比较特别的动作。比如我们的窗口已经最小化到拖盘了,用户以为客户端还没启动,就会在桌面快捷方式中双击打开,但是我们程序又是不支持多开的,这种情况下,就用我们现在方法就可以解决这个问题。
HWND hwnd = FindWindow(null, "窗口标题名");
if (hwnd != NULL) {
PostMessage(hwnd, WM_SHOWWINDOW , 0, 0)
SetForegroundWindow(hwnd);
}
当对方窗口收到消息的时候就可以做显示到前台了。
2、全局级模拟
比如mouse_event, keybd_event, SendInput,但是微软建议用SendInput代替另外两个,这里我们就讲讲SendInput举个例子,我们平时用的比较多的Win + D,可以快速切换到桌面。那这个一套按键是如何模拟的呢?
INPUT inputs[4] = {};
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;??
inputs[0].ki.wVk = VK_LWIN;
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = VK_D;
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = VK_D;
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_LWIN;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
if (uSent != ARRAYSIZE(inputs)) {
OutputString(L"Failed:0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}
讲到这里,中级的模拟鼠标键盘的方法,这个就可以满足我们平时办公的日常操作了,但是这个方法还是不够完美。就是有些窗口是不走Windows消息机制的,那这条路就走不通了。比如Windows上玩手柄游戏,这个方法就行不通了。原因一,游戏讲究的是实时性,响应速度一定要快,因为Windows消息机制是走队列的,消息一但成千上万的触发就会有一定的延迟;原因二,有些游戏具有防作弊功能,就是除了本机的鼠标键盘手柄设备,其他消息一概不处理,所以靠模拟Windows消息就不行了;所以这方面的游戏是不走Windows的消息机制的,你会发现在使用秒点远程控制, 在进行远程玩游戏, 给电脑当云游戏或云电脑的时候,有些远程软件的鼠标和键盘不能操作游戏来完成动作, 提示你使用了作弊器之类,这就是因为游戏之类, 或一些软件本身有反作弊机制.
那我们秒点远控如何解决这个问题呢,那么就是我们接下来要讲的BOSS级的驱动级模拟了。
驱动级模拟
什么是驱动级模拟呢?首先,要普及一下设备驱动程序的知识了。
驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备进行相互通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。因此,驱动程序被比作“ 硬件的灵魂”、“硬件的主宰”、“硬件和系统之间的桥梁”等。
在系统内核里面操作I/O端口,给连接键盘的集成电路发送指令,让它产生一个按下按键的信息,这样你的模拟输入对于所有程序来说就是从一个真实的设备发出的,而且可以绕过很多保护。从而达到模拟鼠标和键盘消息的输入事件。
我们在键盘上按下一个按键时,键盘会产生一个硬件中断,Windows会捕捉到这个中断,从而得知键盘上有了操作,然后由驱动来读取及处理键值。驱动程序的入口函数是
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
里面主要的工作:
1、注册驱动卸载。
2、注册通用IRP分发。
3、注册读取IRP分发。
4、注册电源IRP分发。
5、注册即插即用IRP分发。
6绑定设备。
键盘驱动对应着一条设备链,物理硬件(键盘)处于该设备链的最底端,在键盘上面叠着很多其他的虚拟设备,当键盘上有击键操作的时候,键值会存储在IRP中,所以我们可以创建一个虚拟的设备,绑定到这条设备链中来第一时间获取到按键信息,从而对其进行操作。
如果我们想对键盘的输入做一些改变,比如替换键值,就可以在第3步的时候读取键盘的输入值,并做相应的替换就行了。这个时候对于电脑操作系统看起来, 传送过去的键盘鼠标信号, 看起来都是物理的鼠标与键盘.
相关推荐
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
-
明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
-
首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
-
齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...
- Qt界面——搭配QCustomPlot(qt platform)
-
这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
-
老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
-
用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
-
前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...
- 掌握Visual Studio项目配置【基础篇】
-
1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
-
随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...
- Visual Studio Community 2022(VS2022)安装图文方法
-
直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...
- Qt添加MSVC构建套件的方法(qt添加c++11)
-
前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...
- Qt为什么站稳c++GUI的top1(qt c)
-
为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...
- qt开发IDE应该选择VS还是qt creator
-
如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...
- Qt 5.14.2超详细安装教程,不会来打我
-
Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...
- Cygwin配置与使用(四)——VI字体和颜色的配置
-
简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
- Qt界面——搭配QCustomPlot(qt platform)
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
- 掌握Visual Studio项目配置【基础篇】
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
- Visual Studio Community 2022(VS2022)安装图文方法
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)