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

本文中的例子在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. spring和mybatis集成,自动生成model、mapper,增加mybatis分页功能

    软件简介 Spring是一个流行的控制反转(IoC)和面向切面(AOP)的容器框架,在java webapp开发中使用广泛.http://projects.spring.io/spring-frame ...

  2. jqGrid预定义的格式化类型formatter

    下表列出了jqGrid中的预定义格式化类型 所有预定义类型和编辑模式兼容,就是说数字,链接和email等需要转换,才能使他们被正确编辑 类型 选项(默认值参考语言选项) 描述 integer thou ...

  3. 用apktool工具进行apk的编译和反编译

    1.apktool下载安装 给一个2.0版的csdn地址:http://download.csdn.net/download/txj8612/7408775 下载后无需安装,直接解压缩,得到三个文件: ...

  4. JS之对象

    每个对象的属性有两种,每种属性有4中特征描述符 1.数据属性 1.1 [[configurable]]:表示不能通过delete删除属性,不能修改属性的特性,不能将数据属性改为访问器属性,默认值fal ...

  5. 整理常用的iOS第三方资源

    一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://github. ...

  6. jedis例子

    @Test public void testDiscoverNodesAutomatically(){ Set<HostAndPort> jedisClusterNode=new Hash ...

  7. django使用gmail

    POSTED ON 02 JUL 2007 IN DEVELOPMENT DJANGO PYTHON WEBDid a bit of running around today to get Djang ...

  8. Python Decorator 和函数式编程

    看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程

  9. PHP读取XML文件数据

    XML文件 <?xml version="1.0" encoding="UTF-8"?> <node> <student> ...

  10. Linux命令之md5sum

    1. 背景 在网络传输.设备之间转存.复制大文件等时,可能会出现传输前后数据不一致的情况.这种情况在网络这种相对更不稳定的环境中,容易出现.那么校验文件的完整性,也是势在必行的. md5sum命令用于 ...