MFC和c#中模拟对另一进程的窗口按钮点击
1、
在自动化测试中经常要模拟窗口按钮的点击。
参考文章:http://blog.csdn.net/blackboyofsnp/article/details/3372719
有时我们需要这么做, 手动模拟按钮按下的事件, 让程序做出与按钮真的按下时一样的响应.
设按钮ID为ID_BTN_OK, 当前Dialog窗口.
实际上系统并不能区分按钮是真的按下了(如用鼠标点击), 还是一个我们自己用代码模拟出的一种"假象".
它所需要知道的只是哪个窗口(按钮也是一种窗口)发生了哪一种事件, 然后在消息循环中处理它. 系统怎么才
能知道这些呢? 当然靠的是消息(message), 我们 只需按照Windows或者MFC的标准格式把相应的信息传给系统,
系统就会"上当"了.
向系统传递消息可以用SendMessage或PostMessage(可能还有其他很多函数哦), 但SendMessage执行后系统
会一直等待, 直到要发送的消息被处理掉. 而PostMessage可不管那么多, 发送消息后立即返回程序流程. 当
按钮按下的响应函数中有很大一个循环时, 用SendMessage会出现许多问题, 尤其是要在程序初始化阶段模拟时,
会导致窗体无法完成初始化. 所以我们用PostMessage(). 它的原型为:
BOOL PostMessage( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
这样写;
PostMessage(WM_COMMAND, MAKEWPARAM(ID_BTN_OK, BN_CLICKED), NULL);
这里, WM_COMMAND是要发送的消息, MAKEWPARAM宏是为了组成一个WPARAM,WM_COMMAND消息的WPARAM的低字为控件ID,高字为识别码, 最后一个参数LPARAM可为NULL.相关定义可查看MSDN.
这样我们就把必需的信息格式化好发送给系统了. 当系统在消息循环中收到该消息时, 就知道哦, 你要引发控件ID_BTN_OK
的事件BN_CLICKED, 好的我帮你处理. 于是我们就惊喜地看到按钮看起来真的按下去了, 并执行了和真正按下去时一样的代码.
看评论说不管用,我又试验了一下。新建一个对话框工程,在对话框上添加一个按钮,ID为IDC_BTN_TEST,单击它,为它添加ON_BN_CLICKED消息响应函数:
void CtestDlg::OnBnClickedBtnTest()
{
AfxMessageBox(_T("OK"));
}
然后在对话框的OnInitDialog()函数的return TRUE前加上:
PostMessage(WM_COMMAND, MAKEWPARAM(IDC_BTN_TEST, BN_CLICKED), NULL);
好了,再运行程序,会弹出个消息框 “OK”,说明模拟正确。
2、 C#调用迅雷的时候 自动模拟点击”下载按钮” 关闭弹出窗口
网上 关于 “不弹出《建立任务》的对话框的方法 在迅雷5.9貌似不适用了” 那么我改了一下网上的“监听方式”来进行模拟点击
#region Dll Import 需要导入的api 声明。
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent,
IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd,
int Msg, IntPtr wParam, string lParam);
const int WM_GETTEXT = 0x000D;
const int WM_SETTEXT = 0x000C;
const int WM_CLICK = 0x00F5;
#endregion
//关消息的方法
private void ClosePopWindow(object obj)
{
//这些用spy++可以看到
string lpszParentClass = "#32770"; //整个窗口的类名
string lpszParentWindow = "建立新的下载任务"; //窗口标题
string lpszClass_Submit = "Button"; //需要查找的Button的类名
string lpszName_Submit = "立即下载"; //需要查找的Button的标题
IntPtr ParenthWnd = new IntPtr(0);
IntPtr EdithWnd = new IntPtr(0);
int i = 0;
while (true)
{
//查到窗体,得到整个窗体
ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow);
//判断这个窗体是否有效
if (!ParenthWnd.Equals(IntPtr.Zero))
{
//得到第一级子窗口
EdithWnd = FindWindowEx(ParenthWnd,
new IntPtr(0), "#32770", "");
//Console.WriteLine("第一级-"+EdithWnd.ToString());
//得到Button这个子窗体,并触发它的Click事件
EdithWnd = FindWindowEx(EdithWnd,
new IntPtr(0), lpszClass_Submit, lpszName_Submit);
//Console.WriteLine("第二级-" + EdithWnd.ToString());
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
}
return;
}
Thread.Sleep(1000);
i++;
// Console.WriteLine("第"+i.ToString()+"次检查"); 5秒都没显示出来就推出循环
if (i > 15)
{
//break;
}
}
}
//需要导入如下类库
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.Win32;
//在迅雷提交前添加一个方法
ThreadPool.QueueUserWorkItem(new WaitCallback(ClosePopWindow));
3、
#include <iostream>
#include <fstream>
#include <math.h>
#include <cctype>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
//cout << "Hello world!" << endl;
HWND hwnd = FindWindow( 0, "文件窗口" );
//HWND hWnd2 = GetDlgItem( hwnd, 1001);
char* strs = new char[ 255 ];
HWND hWnd2 = ::FindWindowEx(hwnd,NULL,"Button",NULL);
while ( hWnd2 )
{
GetWindowText( hWnd2, strs, 255 );
cout << strs << endl;
/* if ( strcasecmp( strs, "确定" ) == 0 ) {
break;
}*/
hWnd2 = FindWindowEx( hwnd, hWnd2, "Button", NULL );
}
UINT nCtrlID = ::GetDlgCtrlID(hWnd2);
::PostMessage(hWnd2, WM_COMMAND, (WPARAM)(BN_CLICKED << 16 | nCtrlID), (LPARAM)hWnd2);
::PostMessage(hWnd2,WM_MOUSEMOVE, MK_LBUTTON, MAKELONG(0,0) );
::PostMessage(hWnd2,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(0,0));
::PostMessage(hWnd2,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(0,0));
return 0;
}
4、往编辑框中写入文件(可实现)
SetWindowText
MFC和c#中模拟对另一进程的窗口按钮点击相关推荐
- 面向过程中模拟出面向对象,用c语言模拟出MFC控件,消息循环,“设计用户界面”
大家好,今天给大家分享"怎样用c模拟出MFC控件 简单模拟出消息循环,按钮控件",面向过程中模拟出面向对象. 编程思路 首先用绘图库EasyX绘制窗口,窗口中绘制按钮,把按钮对象化 ...
- 发送linux键盘消息,在C#程序中模拟发送键盘按键消息
using System.Runtime.InteropServices; 引入键盘事件函数 [DllImport("user32.dll")] public static ext ...
- php读取西门子plc_简单说一些PLC中模拟量的相关概念
引言: 有些刚刚接触PLC的小伙伴对PLC中的模拟量编程不理解甚至有点摸不着方向,让他用PLC读取一个压力值模拟量,他会感到有点为难.就是因为PLC中的一些基本概念没有搞清楚,我今天简单来给大家说一些 ...
- MFC应用程序中添加控制台窗口
在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...
- 在PHP中模拟asp的response类
在PHP中模拟asp的response类 习惯了asp或是asp.net开发的人, 他们会经常用到response类,这个类用于处理客户端的相应,可以实现跳转,输出等功能. 在php中没有这个类,但是 ...
- 在GNS3中模拟交换机和PC
在GNS3中模拟交换机和PC (声明:本博客中所有文章仅用于学习交流,学识有限,错误难免,欢迎回帖批评指正,期待与你的交流.) 一.目标:使用ios c3640交换模块,模拟交换机 二.使用VPCS模 ...
- oracle模块损坏,Oracle中模拟及修复数据块损坏
Oracle中模拟及修复数据块损坏,itpub link: http://www.itpub.net/showthread.php?threadid=201766[@more@]Oracle中模拟及修 ...
- OpenGL在frag着色器中模拟手电筒效果
在[OpenGL在frag着色器中模拟点光源]的基础上进行修改,得到手电筒效果(https://blog.csdn.net/qq_37340753/article/details/105029079) ...
- 在 MFC SDI 程序中实现多语言程序界面
下载: SdiML (34K,Visual C++ 6 项目) 今天举个例子,说说怎样使用 CLanguage 类,在 MFC SDI 程序中实现多语言程序界面. 因为 MFC 包装了一些字符串显示处 ...
最新文章
- Java实用教程笔记 Java入门
- 12C OCP 1Z0-063 题库(8月以前)
- linux kernel defconfig和.config
- Html、CSS、JavaScript 实时效果在线编辑器 - 学习的好工具,算不算?!
- 网站服务器在境外境内怎么维护,涉黄网站服务器移至境外 境内维护人员将受制裁...
- Windows Server 2008 R2 Server Core文件操作命令
- pandas merge融合
- 机器字长 存储字长 指令字长 机器字长
- namenode双机热备之操作实践
- 实际波动率与隐含波动率的计算 python
- c语言水仙花数pow,c语言如何解水仙花数
- 【Linux】区分Ubuntu桌面版本和服务器版本
- 华为操作系统 28 年史
- 人工智能时代,主要带来的变革有哪些?
- srm软件非生产采购的解决方案
- npm没有权限,显示no such file or directory
- 时间序列论文:Multi-Scale Convolutional Neural Networks
- Apache Commons Lang3 DateUtils用法
- 广州住房公积金管理中心综合业务管理系统容灾项目(GZIT2010-ZB0103)招标公告...
- 我国信息安全发展历程及相关产业链分析
热门文章
- java 打不开空客手册_空客A320AMM维护手册使用介绍.ppt
- 一名合格的电子工程师,不能逃避的“梗”
- vertx web连接超时 阻塞_Flink之基于Vertx的Mysql异步IO
- python3安装_Python 3.8.2安装教程
- chinaren校友录恢复重新开放_确定!九寨沟景区9月27日对外开放(试运行) 最大限量为每天5000人 各大旅企产品已上线...
- 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
- 搞怪的html代码,这个恶搞网页代码是肿么写出来的?
- 惠普台式计算机系统系统修复,惠普电脑系统如何恢复【方法步骤】
- mysql 5.6 使用ssl_MySQL 5.6--------SSL连接最佳实战
- vue项目开发实战案例_Vue、Spring Boot开发小而完整的Web前后端分离项目实战02