0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Windows消息机制模拟用户输入的方法介绍

冬至子 来源:活魚格勒 作者:鬼人扬 2023-09-07 10:59 次阅读

Windows 消息机制API

xiaoxi guanli jizhi

Windows平台上的应用程序是事件驱动的 ,它们不会显式地调用底层函数以获得用户输入或其它信息,而是等待系统将这些信息提供给它们。同类定义的窗口向系统声明一个唯一的 窗口过程函数 (Window Procedures)。当有关某一窗口句柄的事件发生时(比如:鼠标单击这个窗口,或键盘向这个窗口输入一个字符),系统调用这个函数,把某个特定的消息作为参数

要向特定的窗口过程发送消息,Windows提供了以下函数:

图片

由于lpPrevWndFunc为同一类窗口共有,发送的消息在被某一窗口处理前事实上可能已被多个窗口接收。本文不会用到这一函数,关于此函数的完整定义请参阅:

图片

这一函数在中定义,它向唯一的窗口句柄发送消息,并只在发送的消息被处理后返回。与之相似的是PostMessageW,它在发送消息后立即返回,即只将消息添加到目的窗口句柄的消息队列里,并不等待其处理。

HWND hwnd:接收消息的窗口句柄

(特别地(HWND)0xffff为广播)

UINT Msg:发送的消息类型

WPARAM wParam:发送的消息

LPARAM lParam:发送消息的附加参数

实现刷屏

mian dui dui xiang

获得Windows提供的API函数后,下面用C++实现。

首先将刷屏过程封装到一个类中

--------Bomb.h--------

图片

构造类时向构造函数提供刷屏消息的重复次数和刷屏消息 (UTF-16格式)

ShowMessage()用于调试,把当前类保存的消息输出到控制台上

StartBombing(int)用于开始刷屏,参数定义开始刷屏前的延时。用户可在这段延时内把键盘焦点设置到目标窗口上去,使目标窗口句柄或得消息后把消息内容加入到文本输入框中去。此函数有一个无延迟参数的重载。

消息内容存储在私有段中一个类型为WPARAM的数组中(该类型在上文中有介绍),附加消息是一个值为NULL的LPARAM类型——实现本例中的功能不需要向SendMessageW()提供附加消息。

--------Bomb.cpp--------

图片

图片

出于某些考量,我们在此不提供主要函数的定义。在StartBombing()中,程序按用户设定的刷屏消息重复次数循环times次,并按消息长度循环MessageLength,每次将消息字符串中的第j个字符以WH_CHAR模式向所有窗口广播。获得键盘输入焦点的窗口会将其加入到文本框中。

在发送完一条消息后,通过keybd_event函数模拟一次【回车键按下】事件,使目标窗口(比如:wechat)发送消息或换行。

--------Main.cpp--------

图片

这是应用程序入口点。注意它设置了wcout/wcin的本地化,使其将储存在WPARAM类型(其本质是unsigned int)中的UTF-16数据转化为中文字符输出/输入。

可见,按以上代码编译的应用程序已经可以完成质问马人王的任务。然而, 这速度也太慢了?? 这个速度比打字快不了多少,如果这样的话就没必要用刷屏软件了。哪里出了问题呢?

问题在于,如本文开头介绍:SendMessageW()强制在目标窗口过程将消息处理完毕后才返回,这使得整个过程变得相当缓慢。

解决方法是显而易见的:用PostMessageW()取代原函数。但是这样做会带来新的问题:Post函数只是简单地把消息加入到目标的消息队列去,之后立即返回。而原程序在Post/Send函数返回后会调用keybd_event()模拟一个键盘事件。然而,窗口过程处理消息的速度现在看来并不尽如人意,这往往会导致大量字符消息堆积在消息队列中,最终导致键盘事件和消息发送间不协调(比如:微信PC端输入框中堆积了很多信息而不发送,因为回车键按下事件没有按正常顺序处理)

所以,要兼顾消息的稳定性和发送速度,就要把keybd_event替换成另一个PostMessageW(),使【回车键按下】这一事件也像其它字符事件那样加入到消息队列中去,这样就能保证字符消息和回车间的先后顺序不变。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7148

    浏览量

    161992
  • WINDOWS
    +关注

    关注

    3

    文章

    3440

    浏览量

    87144
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
收藏 人收藏

    评论

    相关推荐

    PCB设计高速模拟输入信号走线方法及规则

    本文主要详解PCB设计高速模拟输入信号走线,首先介绍了PCB设计高速模拟输入信号走线方法,其次阐
    发表于 05-25 09:06 8471次阅读
    PCB设计高速<b class='flag-5'>模拟</b><b class='flag-5'>输入</b>信号走线<b class='flag-5'>方法</b>及规则

    模拟输入信号的保护电路

    本文介绍了四种模拟输入信号的保护电路的实现方法
    发表于 09-07 10:38 1498次阅读

    四种模拟输入信号的保护电路实现方法

    本文介绍了四种模拟输入信号的保护电路的实现方法
    发表于 03-28 09:55 888次阅读

    如何破解windows xp 用户密码

    ”命令把xpuser01这个用户升为超级用户,即可拥有所有权限。5.最后一步,就是重新启动计算机,在登录窗口中输入刚刚更改的新密码便可成功登陆。如果你正在为丢失了登陆口令而烦恼的话,不妨试一试此
    发表于 09-14 11:59

    Windows XP系统隐藏硬盘的方法和技巧

    Windows XP系统隐藏硬盘的方法和技巧 简单有效的方法就是把存有许多重要文件夹的硬盘分区全部隐藏起来。下面以在Windows XP系统中隐藏D盘为例
    发表于 03-19 15:07

    Windows 7最新安装方法大全

    Windows 7最新安装方法大全  Windows 7安装方法可分为:光盘安装法、模拟光驱
    发表于 01-18 09:56 488次阅读

    Windows系统用户摆脱黑客攻击的方法

    Windows系统用户摆脱黑客攻击的方法 IP被盗用是指盗用者使用未经授权的IP来配置网上的计算机。目前IP盗用行为非常常见,许多“不法之徒”用盗用
    发表于 01-27 10:06 569次阅读

    三种单片机模拟串口方法介绍

    三种单片机模拟串口方法介绍 模拟串口就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位
    发表于 02-27 10:41 4849次阅读

    Windows 8将采用全新的反盗版机制

    Windows 8将采用全新的反盗版机制 微软虽然并没有对Windows 7下一代客户端和服务器操作系统的事情做出什么公开声明,但是关于Windows 8的消息仍然络
    发表于 03-27 09:53 281次阅读

    Windows8图文介绍

    计算机基础 Windows 8主要操作及使用方法图文介绍
    发表于 12-16 14:41 0次下载

    模拟信号中高斯噪声对ADC输入的影响介绍

    本文介绍模拟信号中高斯噪声对ADC输入的影响。
    发表于 11-23 15:34 11次下载
    <b class='flag-5'>模拟</b>信号中高斯噪声对ADC<b class='flag-5'>输入</b>的影响<b class='flag-5'>介绍</b>

    浅谈M1处理器想跑Windows软件的方法

    苹果出品的Boot Camp不支持Apple Silicon、知名模拟软件Parallels也尚在适配中,对于那些已经拿到M1处理器Mac的用户来说,想跑Windows软件有什么方法
    的头像 发表于 11-20 09:15 5680次阅读

    PLC模拟输入滤波方法以及优缺点的介绍

    输入滤波通常是限幅滤波、中值滤波、算术平均滤波、递归平均滤波、中值平均滤波、极限平均滤波、一阶滞后滤波、加权递归平均滤波、抖动滤波和极限抖动滤波。本文比较介绍了plc模拟输入滤波
    发表于 12-13 13:51 1432次阅读

    模拟输入输出模块用户手册(详细篇)

    本手册介绍 MELSEC-Q 系列对应 Q64AD2DA 型模拟输入输出模块 ( 以下简称为 Q64AD2DA) 的 规格、使用、编程方法等有关内容。
    发表于 08-25 14:47 2次下载
    <b class='flag-5'>模拟</b><b class='flag-5'>输入</b>输出模块<b class='flag-5'>用户</b>手册(详细篇)

    MELSEC L模拟输入输出模块用户手册

    MELSEC-L模拟输入输出模块用户手册 产品规格书
    发表于 08-25 09:41 8次下载
    MELSEC L<b class='flag-5'>模拟</b><b class='flag-5'>输入</b>输出模块<b class='flag-5'>用户</b>手册