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

本文中的例子在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. Eclipse Android开发环境搭建

    要点: 1)已经安装配置好eclipse和jdk环境 2)给eclipse安装ADT插件(支持android开发) 3)安装配置android sdk环境(类似jdk) 4)eclipse中配置and ...

  2. [troubleshoot][archlinux][X] GPU HANG

    前言:如下内容已经是在hang完大概半个多月后了,当时想写,一直没过来写,写blog果然也是已经花费时间的事情. 最近一直在休假,电脑的使用频率也不多.后来还是为了生活,不情愿的去开始上班了,上班的第 ...

  3. JS中的_proto_

    var grandfather = function(){ this.name = "LiuYashion" ; } var father = function(){}; fath ...

  4. ios 修改webView字体

    UIFont *font = [UIFont systemFontOfSize:]; //方法一 NSString *fontColor =@"CCCCFF"; NSString ...

  5. Vue 双层嵌套

    这种的需要双层嵌套. 代码: <table id="ict-table" class="ict-table ict-report-table blue-theme& ...

  6. html2canvaces用法,js截屏并且下载

    1.首先自己下载引入html2canvaces和jquery(我的demo路径是自己本地的) 2.点击截屏按钮后,跳出层的其他部分是取消保存,点击截取获得的图片区域,表示保存 <!DOCTYPE ...

  7. jquery实时监测手机号是否符合规则,并根据手机号检测结果将提交按钮设为不同状态

    功能: 输入手机号,实时判断手机号输入的是否符合规则: 如果不合规则,则提交按钮为禁用状态,手机号信息不可提交,按钮显示灰色背景: 如果符合规则,则可提交所输入的手机号信息,并将按钮背景设成红色. 代 ...

  8. python 安装pillow

    安装 警告 Pillow >= 2.1.0 不支持 “import _imaging”.请使用 “from PIL.Image import core as _imaging” 代替. 警告 P ...

  9. js 点赞数 处理

    likeNum(num) { if (num === 0) { num = ''; } else if (num > 9999 && num <= 9999999) { n ...

  10. 转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码

    上一篇文章带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑帮我们理解了Windows中的各种类型C/C++运行时库及它的来龙去脉,这是C++开发中特别容易误入歧途的 ...