通过PostMessage/SendMessage实现模拟键盘鼠标按键,发送不成功或出现重复按键的可参考本文
函数原型如下:
BOOL
WINAPI PostMessage(
HWND
hWnd,
UINT
Msg,
WPARAM
wParam,
LPARAM
lParam);
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)
大家都知道通过 PostMessage/SendMessage可以模拟鼠标键盘发送虚拟按键:
hWnd为接收消息的控件句柄
Msg为键盘或鼠标的消息类型(按下、松开、双击、滚动等等)
wParam为键盘按键虚拟码(并非ASCII码)
IParam包括鼠标坐标及键盘按键信息
但不少人在实现过程中遇到问题,现就几个典型问题进行说明。
消息发送不成功
此问题大部分是因为没有找准接收控件句柄,一定要具体到最下层的控件,可通过使用FindWindowEx、EnumChildWindows、GetWindowText、GetClassName等API函数获取到想要的控件句柄,再向此句柄发送消息才有效。比如:记事本中的子控件的类名为“Edit”,.NET编译的TextBox控件类名一般包含“EDIT”等等,要找到此类控件句柄发送消息才能得到有效输入,其它热键输入类型控件也一样。VS中的Spy++是个好东西,可以捕捉任意控件查看属性或消息内容。
也有少部分是因为接收端程序屏蔽了PostMessage/SendMessage消息,发送过去根本就没反应。甚至通过API函数keybd_event、.NET内部方法System.Windows.Forms.SendKeys.Send等全局类按键都没有用,这种可尝试系统底层接口(驱动级)的有关方法,这方面我没什么资料,网上说有类似开源资源且打包成了DLL库可直接调用,但需要系统管理员权限。
发送1次按键结果出现2次按键的情况
发送一次WM_KEYDOWN及一次WM_KEYUP结果出现了2次按键,原因是最后一个参数lParam不规范导致,此参数0到15位为该键在键盘上的重复次数,经常设为1,即按键1次;16至23位为键盘的扫描码,通过API函数MapVirtualKey可以得到;24位为扩展键,即某些右ALT和CTRL;29一般为0;30位-[原状态]已按下为1否则0(KEYUP要设为1);31位-[状态切换](KEYDOWN设为0,KEYUP要设为1)。
资料显示第30位对于keydown在和shift等结合的时候通常要设置为1,未经验证。
中文输入问题
要实现中文输入必须用全局类方式实现,如:API函数keybd_event、.NET内部方法System.Windows.Forms.SendKeys.Send等,这要求先要激活窗口且切换到中文输入法状态才可以。原因是中文输入需要通过输入法程序,而PostMessage/SendMessage绕过了输入法直接到达控件。
程序卡死
一般是使用SendMessage导致,因为使用SendMessage需要一直等待接收端处理完,如果消息传递过程中出现问题将导致线程中断。建议使用PostMessage,发送出去即可不看结果,不用理会消息最后处理结果怎样。
如果懂C#.NET的朋友可参考本人写的源代码,里面代码示例,重点部分有详细的注解说明。
源码下载:模拟键盘鼠标实现虚拟按键
通过PostMessage/SendMessage实现模拟键盘鼠标按键,发送不成功或出现重复按键的可参考本文相关推荐
- linux捕获鼠标点击事件文件,linux获得键盘鼠标事件,模拟键盘鼠标按键
linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...
- linux 鼠标 脚本,linux获得键盘鼠标事件,模拟键盘鼠标按键
linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...
- java中像scanf一样多个输入_VB模拟键盘输入的N种方法
VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...
- Python ctypes 调用API函数模拟键盘鼠标事件
在Python编程中, 有时需要模拟键盘或鼠标事件, 自动操作计算机, 比如玩游戏等. 本文介绍使用ctypes模块调用API函数, 模拟键盘鼠标事件的方法. 目录 1.导入ctypes模块 2.通过 ...
- Selenium中级 | 在Selenium中模拟键盘操作
以下是基于Java语言在Selenium WebDriver中模拟键盘操作的一些常用方法总结 操作单个按键 比如按回车键.按F5进行页面刷新.按F11将窗口设为全屏模式等. 方式1:使用WebElem ...
- 【Python自动化测试】:模拟键盘操作
在selenium中,把键盘的一系列按键封装在Keys类中,因此,我们在模拟键盘操作的时候,需要先导入Keys包,然后配合send_keys()方法使用 # 导入Keys类 from selenium ...
- keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z
首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...
- 如何用应用程序模拟键盘和鼠标按键
在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输 ...
- python实现模拟按键down_Python如何实现键盘鼠标按键模拟 Python实现键盘鼠标按键模拟代码...
Python如何实现键盘鼠标按键模拟?本篇文章小编给大家分享一下Python实现键盘鼠标按键模拟代码,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 需要安装pypiwin3 ...
最新文章
- java 中线程的状态
- Office安装时报错1907的解决方法
- vmware虚拟机移植带来的问题
- 架构设计的目标与衡量
- 我的同学是计算机作文,同学相见作文
- Docker安装实践Jenkins
- 排序规则在拼音处理中的应用.sql
- Python画数码晶体管日期(年月日时分秒)
- zebradesigner2教程_ZebraDesigner快速使用说明
- LM2596数控电路原理分析
- SAR、PAR和DAR
- git 代码行数统计
- CSS基础 | (1) CSS是什么
- 批量下载网页链接---数据集批量下载
- 苹果账户登录_开心,安卓手机支持和iPhone内APP账户互通
- WeUI 简明入门指南
- 其他的一些生活小常识
- android pay 教程,移动支付框架-AndroidPay
- oracle查询用户时候被锁,Oracle用户被锁的原因及解决办法
- 达内python学费22000_交钱了,学了3天Python编程,我想放弃了......