【转】如何用SendMessage模拟某一按钮的点击事件

VC++模拟键盘输入(keybd_event() 、 PostMessage() /SendMessage()、SendInput())详解 详细介绍C++模拟键盘输入的三种方法,而且还带实例:keybd_event() 、 PostMessage() /SendMessage()、SendInput(), 阅读详情

今天在写程序的时候,用到了进程间的通信,上网查了些相关的资料,一般都是通过消息、共享内存、 socket,管道(Pipe),信箱(Mailslot),等等。因为我进程间通信的时候数据量不太大,所以就先测试了一下消息。

一般情况下,用消息来实现进程通信相对比较简单,自定义消息、手动添加消息映射、编写响应函数,发送端先FindWindow(),然后就向目标进程SendMessage()。自定义消息的测试没有什么问题,但在向目标进程发送系统消息时遇到了些问题,发送WM_CLOSE消息也可以,但是在我尝试发送按钮消息时,遇到了些麻烦,在查资料,并多次测试后终于搞定,看到网上一些资料都没有明确的答案,就把我的一些体会发在这里,有朋友遇到这个问题时也就少走点弯路。当然,我个人水平也很菜,高手就不要看了!

自定义消息和消息映射就不多说了,获取窗口进程:
CWnd *pWnd=CWnd::FindWindow(NULL,str);

模拟其中窗口上的按钮点击事件可以采用以下的方法:

1、pWnd->SendMessage(WM_COMMAND,IDC_BUTTON1,0);

2、pWnd->SendMessage(WM_COMMAND,((WPARAM)BN_CLICKED)<<8|(WPARAM)IDC_BUTTON1,0L);

3、pWnd->SendDlgItemMessage(IDC_BUTTON1,BM_CLICK,0,0);
 
4、::SendMessage(pWnd->GetSafeHwnd(),WM_COMMAND,IDC_BUTTON1,NULL);
 
5、::SendMessage(pWnd->GetDlgItem(IDC_BUTTON1)->GetSafeHwnd(),WM_LBUTTONDOWN,IDC_BUTTON1,0);
  ::SendMessage(pWnd->GetDlgItem(IDC_BUTTON1)->GetSafeHwnd(),WM_LBUTTONUP,IDC_BUTTON1,0);

6、pWnd->GetDlgItem(IDC_BUTTON1)->SendMessage(WM_LBUTTONDOWN);
  pWnd->GetDlgItem(IDC_BUTTON1)->SendMessage(WM_LBUTTONUP);

注意:
1、如果模拟自己进程内的按钮,前面的方法都可以使用,将其中pWnd替换为this或直接为空即可。

2、如果是向另外一个进程发送消息,并模拟另外进程中的按钮的点击事件,那么有一点要注意,就是其中的按钮ID号,不能使用比如IDC_BUTTON1这样的宏,因为在本程序里也有定义,并且这个值可能和你想要模拟的按钮的ID在它所在的进程中的ID不同,它会被默认
替换为本进程内的值。
举个例子,现在你编写了两个对话框程序A和B,在程序A中,定义了两个按钮,分别为IDC_BUTTON1和IDC_BUTTON2,打开Resource.h查看一下它们的ID值:
#define IDC_BUTTON1  1000
#define IDC_BUTTON2  1001
在程序B中,定义了一个按钮,名字为IDC_BUTTON1,打开Resource.h查看一下该按钮的ID值:
#define IDC_BUTTON1  1001
从两个头文件中可以看出,程序A中的IDC_BUTTON2和ID值和程序B中的IDC_BUTTON1的ID值相同,而两个程序的IDC_BUTTON1的值并不相同。
注意,问题就出在这这儿。如果我们想模拟程序B中按钮IDC_BUTTON1的点击事件,按照前面的方法是行不通的,不信可以试试。
但如果我们在使用前面的那些方法时,改变一下传递的参数,将其中的IDC_BUTTON1改为IDC_BUTTON2,试一下,进程B中的按钮成功的模拟出来了,竟然达到了我们的目标。那么奇怪,明明B程序中按钮的ID是IDC_BUTTON1啊!现在改为IDC_BUTTON2反而成功了呢?为什么会这样呢?
其实这主要是因为两个程序的不同引起的,因为我们在A程序中调用前面的方法来模拟程序B的按钮时,程序B中的IDC_BUTTON1按钮的实际的ID值是非曲直1001,而程序A中却把IDC_BUTTON1的值设为了1000,所以无论你怎么发送消息都没用,程序B里面1000的ID值并不是IDC_BUTTON1对应的值,它实际的值应该是1001。不信的话,可以用1001代替IDC_BUTTON1,然后用前面的那些方法试试。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/lne818/archive/2007/03/18/1533021.aspx

C++ 实现按键精灵——keybd_event和SendMessage C++ 实现按键精灵 文章目录C++ 实现按键精灵1.keybd_event 实现1.1 函数说明1.2 关于扫描码的补充说明1.3 示例代码2.SendMessage 实现2.1 函数说明2.2 示例代码2.3查找句柄 最近玩游戏需要用到按键精灵,Google 结果一堆不安全链接,担心有风险,索性就自己找资料写。 本文主要介绍两个函数 keybd_event 和 SendMessage ;两者... 阅读详情

相关推荐

使用JNA获取窗口句柄,并发送消息

使用JNA获取窗口句柄,并发送消息 可以使用applet的方式,实现 CS架构的SSO.

如何用SendMessage模拟某一按钮的点击事件

今天在写程序的时候,用到了进程间的通信,上网查了些相关的资料,一般都是通过消息、共享内存、 socket,管道(Pipe),信箱(Mailslot),等等。因为我进程间通信的时候数据量不太大,所以就先测试了一下消息。一般情况下,用消息来实现进程通信相对比较简单,自定义消息、手动添加消息映射、编写响应函数,发送端先FindWindow(),然后就向目标进程SendMessage()。自定义消息的

lne818的专栏 6923

【网络】PFC背景和原理 、文档(DCB=PFC + ETS,DCBX=DCB扩展)

目录 零、背景 一、PFC 1.概述 2.报文格式 3.工作机制 二、ETS 产生原因 基本原理 优先级组的调度 优先级的调度 三、DCBX 产生原因 基本原理 DCBX TLV介绍 五、PFC 拥塞研究(文档收集) 六、DC-QCN算法 (网络工程师必会) 7.1 α更新 7.2 降速 7.3 提速 8.总结 ...

小鱼菜鸟的博客 2165

Java如何发送文本消息到Window窗口

简介 java要发送消息给windows窗口,首先需要获得windows窗口的句柄,然后通过JNA库中的提供的sendmsg函数即可向windows窗口传递消息。 需要资源 jna-platform-4.0.0.jar 创建自定义Myuser32接口 Myuser32库的实例   static Myuser32 INSTANCE = (M

XUXUEMING的博客 8180

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 444

使用SendMessage模拟某一按钮的点击事件

今天在写程序的时候,用到了进程间的通信,上网查了些相关的资料,一般都是通过消息、共享内存、 socket,管道(Pipe),信箱(Mailslot),等等。因为我进程间通信的时候数据量不太大,所以就先测试了一下消息。 一般情况下,用消息来实现进程通信相对比较简单,自定义消息、手动添加消息映射、编写响应函数,发送端先FindWindow(),然后就向目标进程SendMessage()。自定义消

shuaiqidiudiu的专栏 4454

【超详细】安装了anaconda后,Ubuntu18+COLMAP配置疯狂踩坑踩至魔怔的记录

本博客收集了博主在Ubuntu18系统中编译COLMAP所遇到的困难,提供了解决方法,也收集了目前网上大多数的坑,除此之外,也为Ubuntu18系统下COLMAP的安装提供了一种新的路径。

Stay_Foo_lish的博客 3508

用SendMessage模拟某一按钮的点击事件

今天在写程序的时候,用到了进程间的通信,上网查了些相关的资料,一般都是通过消息、共享内存、 socket,管道(Pipe),信箱(Mailslot),等等。因为我进程间通信的时候数据量不太大,所以就先测试了一下消息。   一般情况下,用消息来实现进程通信相对比较简单,自定义消息、手动添加消息映射、编写响应函数,发送端先FindWindow(),然后就向目标进程SendMessage()

安卓世界库 2888

学生党投稿Applied Soft Computing:从导师账号登录到通讯作者设置的全流程解惑

本文详细解析了学生投稿Applied Soft Computing期刊的全流程,重点介绍了导师账号登录、通讯作者设置、作者排序调整以及开放获取费用等关键环节的避坑技巧。针对LaTeX稿件处理和财务选项选择提供了实用建议,帮助学生顺利完成SCI期刊投稿。

weixin_30352191的博客 210

Frida+Objection保姆级教程:从环境搭建到实战Hook(含Wallbreaker插件使用)

本文提供了一份从零开始的Frida与Objection移动安全动态分析实战指南。详细讲解了Python环境配置、Frida-Server部署、Objection核心命令使用以及Wallbreaker插件安装与应用。通过实战案例演示如何Hook网络请求(如HttpURLConnection和OkHttp3),帮助安全研究人员快速掌握应用运行时行为分析与漏洞挖掘技能。

weixin_28318011的博客 99

win32 SendMessage PostMessage 后台模拟鼠标点击

win32 SendMessage PostMessage 后台模拟鼠标点击SendMessagePostMessage参数WM_LBUTTONUP SendMessage 将指定的消息发送到一个或多个窗口。SendMessage函数的函数调用指定的窗口的窗口过程,并不会返回,直到窗口过程已经处理了该消息 PostMessage 将消息放置在与创建指定窗口的线程相关联的消息队列中,并不等待线程处理消息的情况下返回消息。 参数 LRESULT SendMessage( HWND hWnd, UIN

FaceSeace的博客 1万+

告别‘耀斑’降落:手把手教你用PX4+激光测距仪实现固定翼精准自动着陆

本文详细介绍了如何利用PX4飞控与激光测距仪实现固定翼无人机的精准自动着陆,解决传统气压计在低空环境下的测量误差问题。通过硬件选型、安装要点、PX4参数配置及实战调校,帮助开发者实现厘米级高度感知,优化降落曲线,提升着陆稳定性与安全性。

weixin_30336061的博客 519

C#根据弹窗标题获取窗体句柄并模拟点击按钮(FindWindow,FindWindowEx,SendMessage)...

任务:将下面弹窗自动关闭 /// <summary> /// 找到窗口 /// </summary> /// <param name="lpClassName">窗口类名(例:Button)</param> /// <param name="...

weixin_33724570的博客 3219

光伏硅片瑕疵检测边缘计算方案:Java+YOLOv11n+GraalVM Native Image+树莓派5部署,工业级高可靠落地

本文提出了一种基于边缘计算的光伏硅片瑕疵检测方案,针对传统人工检测和云端AI方案的不足,采用Java+YOLOv11n+树莓派5的技术路线,实现了低延迟、高可靠的工业级检测。方案核心特点包括: 分层解耦的边缘架构,将感知、推理全链路下沉到树莓派5,端到端延迟<100ms; 创新性技术选型组合:Java 17+ONNX Runtime+GraalVM Native Image,内存占用<200MB; 安防级可靠性设计,支持断网缓存、看门狗守护、异常自动恢复等工业场景需求; 完全基于开源技术栈,硬件

2601_94871597的博客 474

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python中sendmessage的使用_SendMessage用法实例

转:http://blog.youkuaiyun.com/coolszy/article/details/5523700SendMessage用法windowsbuttonmenucommandlistc#函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一。函数原型:LRESULT Send...

weixin_39926943的博客 4005

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MFC和c#中模拟对另一进程的窗口按钮点击

1、 在自动化测试中经常要模拟窗口按钮的点击。 参考文章:http://blog.youkuaiyun.com/blackboyofsnp/article/details/3372719 有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应. 设按钮ID为ID_BTN_OK, 当前Dialog窗口. 实际上系统并不能区分按钮是真的按下了(如用鼠标点击), 还是一个我们自己用代码模拟出的一种"假象". 它所需要知道的只是哪个窗口(按钮也是一种窗口)发生了哪一种事件, 然...

u011555996的博客 1998

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

转发:如何用SendMessage模拟某一按钮的点击事件

http://jacky-dai.iteye.com/blog/868537

Yangxk的专栏 8604

如何使用SendMessage函数实现模拟鼠标点击按钮事件?

用SPY++获得了QQ连连看的 开始按钮坐标! 利用坐标写了如下代码:         m_hGame = FindWindow(NULL, "QQ游戏 - 连连看角色版");         int lparam;         lparam = ((562)         lparam = ((562)         SendMessage(m_hGame, WM_LBU

zqf_office的专栏 8337

chatgpt赋能python:Python获取窗口句柄并模拟点击按钮

在Windows操作系统中,每个打开的窗口都有一个唯一的标识符,称为“句柄”。句柄是操作系统为应用程序分配的一种标识符,可以用来访问和操作窗口。Python提供了一个库(pywin32)来访问Windows API,可以使用它来获取窗口句柄。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。

findyi123的博客 2306

点击其他程序中的按钮

从一个程序点击另一个程序按钮本文介绍如何从一个程序获取其他程序窗口、控件等的句柄,并向这些窗口、控件发送消息,模拟人为点击等事件 [TOC]相关函数 函数原型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);参数:IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则

liucc09的博客 5286

SendMessage用法

 函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。该函数是应用程序和应用程序之间进行消息传递的主要手段之一。    函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);    参数:    hWnd:其窗口程序将接收消息的窗口的句柄。如果此参

若水 2万+
上一篇: 函数指针数组
下一篇: 【转】谈谈使用VFW在windows下编程控制摄像头(一)。 【孙涛】
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值