C++用PostMessage模拟按钮点击
有时我们可能会在某个程序中用到模拟按钮点击事件。
本文中的例子在MFC程序中调试通过,duilib的没试过,还需探索
不多说,上代码:
#include "stdafx.h"
#include "windows.h"
#include "Psapi.h"
#include "atlstr.h"
#include <string.h>
#include<iostream>
using namespace std; #pragma comment(lib,"Psapi");
#define ID_EXEC_CURFILE 32807
#define ID_RCL_HELP 32804
CString str; //根据exe名字一部分查找进程id,返回
DWORD FindProcess(char *strProcessName)
{
DWORD aProcesses[], cbNeeded, cbMNeeded;
HMODULE hMods[];
HANDLE hProcess;
char szProcessName[MAX_PATH];
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return ;
for(int i=; i< (int) (cbNeeded / sizeof(DWORD)); i++)
{
hProcess = OpenProcess( /*PROCESS_QUERY_INFORMATION | PROCESS_VM_READ*/PROCESS_ALL_ACCESS, FALSE, aProcesses[i]);
if (hProcess == NULL)
continue;
EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
GetModuleFileNameEx( hProcess, hMods[], szProcessName,sizeof(szProcessName)); if(strstr(szProcessName, strProcessName))
{
OutputDebugString(_T("Find Process ok\n"));
cout<<szProcessName<<endl;
return(aProcesses[i]);
}
}
OutputDebugString(_T("Find Process fail\n"));
return ;
} /*******************************************************************
* 函数名称:GetWindowHandleByPID
* 功 能:根据进程ID找窗口句柄
* 参 数:dwProcessID:进程Id号
* 返 回 值:成功返回窗口句柄,失败返回NULL
*******************************************************************/
HWND GetWindowHandleByPID(DWORD dwProcessID)
{
HWND h = GetTopWindow();
while ( h )
{
DWORD pid = ;
DWORD dwTheardId = GetWindowThreadProcessId( h,&pid); if (dwTheardId != )
{
if ( pid == dwProcessID/*your process id*/ )
{
// here h is the handle to the window
OutputDebugString(_T("GetWindowHandleByPID ok\n"));
return h;
}
} h = GetNextWindow( h , GW_HWNDNEXT);
} OutputDebugString(_T("GetWindowHandleByPID faild\n"));
return NULL;
} /*******************************************************************
* 函数名称:SendMsgChildWindow
* 功 能:遍历子窗口句柄并发送按钮消息
* 参 数:hWnd:父窗口句柄
* 返 回 值:null
*******************************************************************/
void SendMsgChildWindow(HWND hWnd, UINT command, UINT ID, UINT eventType)
{
HWND hd = ::GetWindow(hWnd,GW_HWNDNEXT);
if (hd == NULL)
{
cout << "can not find window" <<endl;
}
while(hd!=NULL) //循环得到所有的子窗口
{
PostMessage(hd,command,MAKEWPARAM(ID, eventType),);
hd=GetNextWindow(hd,GW_HWNDNEXT);
}
//PostMessage(HWND_BROADCAST,command,MAKEWPARAM(ID, eventType),0);//广播,不建议使用,其他窗口也会收到
} /*******************************************************************
* 函数名称:FindWhndByName
* 功 能:根据exe名字找窗口句柄
* 参 数:exeName
* 返 回 值:窗口句柄,找不到返回NULL
*******************************************************************/
HWND FindWhndByName(char *exeName)
{
HANDLE handle;
handle = OpenProcess(
// PROCESS_QUERY_INFORMATION | // Required by Alpha
// PROCESS_CREATE_THREAD | // For CreateRemoteThread
// PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
// PROCESS_VM_WRITE, // For WriteProcessMemory
PROCESS_ALL_ACCESS,
FALSE, FindProcess(exeName));
if (handle == NULL)
{
OutputDebugString(_T("error: handle null\n"));
}
DWORD ProcessId = GetProcessId(handle); return GetWindowHandleByPID(ProcessId);
} int CharToInt(char* str)
{
int ret = atoi(str);
return ret;
} int HexstrToInt(char *str)
{
int nValude = ;
sscanf(str,"%x",&nValude);
return nValude;
} int _tmain(int argc, _TCHAR* argv[])
{
HWND wHnd;
if (argc < )
{
OutputDebugString(_T("parameters not enough\n"));
return ;
}
else if (argc == )
{
wHnd = FindWhndByName(argv[]);
SendMsgChildWindow(wHnd,HexstrToInt(argv[]),CharToInt(argv[]),CharToInt(argv[]));
}
else if (argc == )
{
wHnd = FindWhndByName(argv[]);
if (wHnd == NULL)
{
wHnd = FindWhndByName(argv[]);
cout << "second exeName" <<endl;
}
SendMsgChildWindow(wHnd,HexstrToInt(argv[]),CharToInt(argv[]),CharToInt(argv[]));
} return ;
}
四个参数:
第一个参数:进程的名字 例如:QQ.exe
第二个参数:消息类型 例如: 0x0111 代表 WM_CZMMAND
第三个参数:资源ID(按钮,菜单等)例如:32807(按钮ID可在程序源码中找到)
第四个参数:事件类型 例如:0 代表按钮单击(BN_CLICKED)
第二第四个参数具体值可在:WinUser.h 头文件中找到
调用实例:PostMsgProcess.exe QQ.exe 0x0111 32807 0
五个参数:
第一个参数:进程的名字 例如:QQ
第二个参数:进程的名字 例如:QQ.exe
第三个参数:消息类型 例如: 0x0111 代表 WM_CZMMAND
第四个参数:资源ID(按钮,菜单等)例如:32807(按钮ID可在程序源码中找到)
第五个参数:事件类型 例如:0 代表按钮单击(BN_CLICKED)
第二第四个参数具体值可在:WinUser.h 头文件中找到
调用实例:PostMsgProcess.exe QQ QQ.exe 0x0111 32807 0
如果有多个符合条件的窗口,先根据第一个参数找对应的窗口,找到就不再寻找,只能找一个符合条件的窗口发送消息
需要的库和头文件:http://files.cnblogs.com/files/george-cw/psapi.rar
C++用PostMessage模拟按钮点击的更多相关文章
- Objective-C:模拟按钮点击事件理解代理模式
OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...
- Android 如何通过代码模拟按钮点击 延时函数
View.performClick(); 比如: private Button mButton01; mButton01 = (Button)findViewById(R.id.myButt ...
- WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)
好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都 ...
- js触发按钮点击事件
js触发按钮点击事件 博客分类: javascript 模拟JS触发按钮点击功能 <html> <head> <title>usually function&l ...
- css3模拟jq点击事件
还是这个梗,收好冷.今天是一个css3模拟jq点击事件,因为我发现,css3中没有类似于,js的点击事件,那么,可不可以仿照 jq的效果,类似的做一个呢?主要用到,input里面的radio 单选按钮 ...
- Runtime应用防止按钮连续点击 (转)
好久之前就看到过使用Runtime解决按钮的连续点击的问题,一直觉得没啥好记录的.刚好今天旁边同时碰到这个问题,看他们好捉急而且好像很难处理,于是我先自己看看… 前面自己也学习了很多Runtime的东 ...
- android 自定义控件——(五)按钮点击变色
----------------------------------按钮点击变色(源代码下有属性解释)------------------------------------------------- ...
- UI-切圆角、透明度、取消按钮点击高亮效果、按钮文字带下划线
一.切UIView的某个角为圆角 如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某 ...
- 友盟(Swift)-集成、统计用户数量、具体页面访问数量、具体按钮点击数量
什么是友盟.有什么用? 这些傻瓜问题这里就不解释了,可以自己百度去. 友盟提供的文档和demo都是oc的,这里用swift写了一个小demo,在此分享一下. 步骤1:友盟后台注册应用(iOS),拿到a ...
随机推荐
- Android RSA加密解密
概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数 ...
- php mysql_num_rows() 与 mysql_affected_rows()
mysql_num_rows(data) 函数返回结果集中行的数目. data 结果集.该结果集从 mysql_query() 的调用中得到. 此命令仅对 SELECT 语句有效.要取得被 INSER ...
- 关于js SDK的程序,java SDK的程序
一:JS SDK 1.修改配置workspace 2.导入 3.Demo.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Trans ...
- ListView或GridView的Adapter使用Glide加载图片异常
报错信息为:You must not call setTag() on a view Glide is targeting 原因就是View使用setTag后导致Glide之前请求的标记被清除,强制转 ...
- 我的面经(ing)
爱立信: C和C++区别 堆和栈的区别 多态性:类的继承 重载与重复声明的区别 大端和小端的概念 一个排序程序(任意) 三次握手过程,优点 为什么UDP没有三次握手 TCP,UDP的区别 五层协议,各 ...
- CentOS 7 搭建 LNMP
一.安装httpd 1.yum install httpd -y 2.启动服务:systemctl start httpd 3.设置开机启动:systemctl enable 二.安装mariadb ...
- U盘文件偷窃程序
// Drives.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "windows.h" #incl ...
- listener.ora增加监听端口
一个简单的listener.ora # listener.ora Network Configuration File: d:\app\zyd\product\11.2.0\dbhome_1\netw ...
- StructureMap使用方法(转)
终于到了题目中的MVC使用StructureMap依赖注入的配置与实现了.在ASP.Net三层架构应用中StructureMap的是最老的IOC/DI工具,也就是依赖注入,很多线上的项目都使用了Str ...
- 腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)
导读:在互联网企业,任何一个APP都要事先规划好数据体系,才允许上线运营,有了数据才可以更好的科学运营.因此本文将为大家介绍APP的基础数据指标体系.主要分为五个维度,包括用户规模与质量.参与度分析. ...