有时我们可能会在某个程序中用到模拟按钮点击事件。

本文中的例子在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模拟按钮点击的更多相关文章

  1. Objective-C:模拟按钮点击事件理解代理模式

    OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...

  2. Android 如何通过代码模拟按钮点击 延时函数

    View.performClick();   比如: private Button mButton01;    mButton01 = (Button)findViewById(R.id.myButt ...

  3. WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

    好久没有写文章,发一篇顶顶博客访问量.别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么..流量该多少就多少吧... 回到主题,在webbrowser中点击某链接网上几乎都 ...

  4. js触发按钮点击事件

    js触发按钮点击事件 博客分类: javascript   模拟JS触发按钮点击功能 <html> <head> <title>usually function&l ...

  5. css3模拟jq点击事件

    还是这个梗,收好冷.今天是一个css3模拟jq点击事件,因为我发现,css3中没有类似于,js的点击事件,那么,可不可以仿照 jq的效果,类似的做一个呢?主要用到,input里面的radio 单选按钮 ...

  6. Runtime应用防止按钮连续点击 (转)

    好久之前就看到过使用Runtime解决按钮的连续点击的问题,一直觉得没啥好记录的.刚好今天旁边同时碰到这个问题,看他们好捉急而且好像很难处理,于是我先自己看看… 前面自己也学习了很多Runtime的东 ...

  7. android 自定义控件——(五)按钮点击变色

    ----------------------------------按钮点击变色(源代码下有属性解释)------------------------------------------------- ...

  8. UI-切圆角、透明度、取消按钮点击高亮效果、按钮文字带下划线

    一.切UIView的某个角为圆角 如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某 ...

  9. 友盟(Swift)-集成、统计用户数量、具体页面访问数量、具体按钮点击数量

    什么是友盟.有什么用? 这些傻瓜问题这里就不解释了,可以自己百度去. 友盟提供的文档和demo都是oc的,这里用swift写了一个小demo,在此分享一下. 步骤1:友盟后台注册应用(iOS),拿到a ...

随机推荐

  1. phpstorm 实用快捷键 和 注释

    1. 注释   类似 /**退款详情 * @param * @param * @param * @return * @author */ 在方法中引入,直接/**+enter键 2.快捷建 CTRL ...

  2. js判断移动终端url跳转

    CODE <script> //判断终端url跳转 function sp_isMobile() { return Boolean(navigator.userAgent.match(/. ...

  3. App 打包并跳过 AppStore 的发布下载

    一.App 打包 (编译 -> 链接 -> 打包) 1) 下载发布版的证书并安装. 2)Target -> Build Setting,改为发布版本的 profile 3) Targ ...

  4. RESTful在asp.net webAPI下的PUT、POST实现,json传输实体

    1.put方式实现 使用的是firefox的插件:httpRequester 2.Post实现 同上, 传入json,后台得到实体: 3.post传入string字符串,注意,string传入的时候, ...

  5. magento 每日新品展示

    http://blog.csdn.net/benben0503/article/details/8647020 1.创建Newarrivals.php文件: <?php /** * This i ...

  6. 从oracle数据表中读取表结构

    drop table aa_tab;create table aa_tab asselect  A.TABLE_NAME  表名,  A.column_name 字段名,A.data_type  数据 ...

  7. RDIFramework.NET V2.9版本多语言的实现

    RDIFramework.NET V2.9版本多语言的实现 现在是国际化时代,软件也不能落后.一个公司里很可能会有老外,也可能有台湾的朋友,他们用软件的习惯都不一样,若同样一个软件同时能适应多种语言文 ...

  8. SVN----------项目服务器上的svn客户端自动更新设置。

    1.局域网服务器上搭建了PHP项目运行的环境,然后怎么样讲根目录拉去到的项目可以随着开发人员提交的代码,自动更新成最新的代码. 2.首先将svn版本库上的代码拉取到www目录下或者你的根目录. 3.然 ...

  9. [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  10. Qt之qt4.7 和qt 4.8.4 交叉实践

    开发机环境搭建: 测试环境:CentOs7.1  Ubuntu 12.0.4 操作流程: 一.编译Qt4.7.0 1)CentOS上实践 1.tar xzvf qt-everywhere-openso ...