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

本文中的例子在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. asp.net identity 2.2.0 中角色启用和基本使用(七)提示点

    在使用asp.net identity 2.2.0 中,大家可能设计到一些修改和配置 关于Identity的配置,在App_Start文件中的IdentityConfig.cs中,这里几乎有你需要的一 ...

  2. 针对focus和blur的Dom事件触发顺序

    Dom事件触发顺序,拿文本框举例: 它会先触发focus事件,之后才会触发在有交点之后才能触发的一些如 click  change 等事件(但如果有mousedown则先执行). 而相对于blur而言 ...

  3. CSS之border

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. bat批处理完成jdk tomcat的安装

    在完成一个web应用项目后,领导要求做一个配置用的批处理文件,能够自动完成jdk的安装,tomcat的安装,web应用的部署,环境变量的注册,tomcat服务的安装和自动启动 参考了网上很多的类似的批 ...

  5. 使用Mod_JK链接Apache和Tomcat

    There are many potential problems associated with the default configuration of mod_jk.  Let's say it ...

  6. Hausdorff distance

    微分动力系统原理 这本书里有介绍 Hausdorff距离是描述两组点集之间相似程度的一种量度,它是两个点集之间距离的一种定义形式:假设有两组集合A={a1,…,ap},B={b1,…,bq},则这两个 ...

  7. yum下载rpm

    yum下载rpm yum update --downloadonly --downloaddir=/root/rpm_package/   python-pip

  8. 检测浏览器是否支持cookie方法

    cookie 摘自: http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html Cookie是什么? Cookie 是一小段文本信息 ...

  9. Java反射与动态代理

    Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的 ...

  10. 使用Go开发web服务器

    原文链接 Go(Golang.org)是在标准库中提供HTTP协议支持的系统语言,通过他可以快速简单的开发一个web服务器.同时,Go语言为开发者提供了很多便利.这本篇博客中我们将列出使用Go开发HT ...