函数原型如下:

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实现模拟键盘鼠标按键,发送不成功或出现重复按键的可参考本文相关推荐

  1. linux捕获鼠标点击事件文件,linux获得键盘鼠标事件,模拟键盘鼠标按键

    linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...

  2. linux 鼠标 脚本,linux获得键盘鼠标事件,模拟键盘鼠标按键

    linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...

  3. java中像scanf一样多个输入_VB模拟键盘输入的N种方法

    VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...

  4. Python ctypes 调用API函数模拟键盘鼠标事件

    在Python编程中, 有时需要模拟键盘或鼠标事件, 自动操作计算机, 比如玩游戏等. 本文介绍使用ctypes模块调用API函数, 模拟键盘鼠标事件的方法. 目录 1.导入ctypes模块 2.通过 ...

  5. Selenium中级 | 在Selenium中模拟键盘操作

    以下是基于Java语言在Selenium WebDriver中模拟键盘操作的一些常用方法总结 操作单个按键 比如按回车键.按F5进行页面刷新.按F11将窗口设为全屏模式等. 方式1:使用WebElem ...

  6. 【Python自动化测试】:模拟键盘操作

    在selenium中,把键盘的一系列按键封装在Keys类中,因此,我们在模拟键盘操作的时候,需要先导入Keys包,然后配合send_keys()方法使用 # 导入Keys类 from selenium ...

  7. keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z

    首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...

  8. 如何用应用程序模拟键盘和鼠标按键

    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的输入操作,我们能否通过编制程序来代替手工输 ...

  9. python实现模拟按键down_Python如何实现键盘鼠标按键模拟 Python实现键盘鼠标按键模拟代码...

    Python如何实现键盘鼠标按键模拟?本篇文章小编给大家分享一下Python实现键盘鼠标按键模拟代码,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 需要安装pypiwin3 ...

最新文章

  1. java 中线程的状态
  2. Office安装时报错1907的解决方法
  3. vmware虚拟机移植带来的问题
  4. 架构设计的目标与衡量
  5. 我的同学是计算机作文,同学相见作文
  6. Docker安装实践Jenkins
  7. 排序规则在拼音处理中的应用.sql
  8. Python画数码晶体管日期(年月日时分秒)
  9. zebradesigner2教程_ZebraDesigner快速使用说明
  10. LM2596数控电路原理分析
  11. SAR、PAR和DAR
  12. git 代码行数统计
  13. CSS基础 | (1) CSS是什么
  14. 批量下载网页链接---数据集批量下载
  15. 苹果账户登录_开心,安卓手机支持和iPhone内APP账户互通
  16. WeUI 简明入门指南
  17. 其他的一些生活小常识
  18. android pay 教程,移动支付框架-AndroidPay
  19. oracle查询用户时候被锁,Oracle用户被锁的原因及解决办法
  20. 达内python学费22000_交钱了,学了3天Python编程,我想放弃了......

热门文章

  1. 关于Java双大括号{{}}
  2. 【Scratch】青少年蓝桥杯_每日一题_11.01_画笔功能
  3. Excel中的美元符号$
  4. python 泰森多边形边界_泰森多边形
  5. turtle绘制八边形、八角边形
  6. python用双重循环输出菱形_Python 使用双重循环打印图形菱形操作
  7. EXCEL如何隔三行设置背景色
  8. 云呐|加强固定资产设备信息化管理工作
  9. 关于坯布的面料克重问题
  10. 【数据分析】基础技术篇 三——matplotlib