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#中模拟对另一进程的窗口按钮点击相关推荐

  1. 面向过程中模拟出面向对象,用c语言模拟出MFC控件,消息循环,“设计用户界面”

    大家好,今天给大家分享"怎样用c模拟出MFC控件 简单模拟出消息循环,按钮控件",面向过程中模拟出面向对象. 编程思路 首先用绘图库EasyX绘制窗口,窗口中绘制按钮,把按钮对象化 ...

  2. 发送linux键盘消息,在C#程序中模拟发送键盘按键消息

    using System.Runtime.InteropServices; 引入键盘事件函数 [DllImport("user32.dll")] public static ext ...

  3. php读取西门子plc_简单说一些PLC中模拟量的相关概念

    引言: 有些刚刚接触PLC的小伙伴对PLC中的模拟量编程不理解甚至有点摸不着方向,让他用PLC读取一个压力值模拟量,他会感到有点为难.就是因为PLC中的一些基本概念没有搞清楚,我今天简单来给大家说一些 ...

  4. MFC应用程序中添加控制台窗口

    在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...

  5. 在PHP中模拟asp的response类

    在PHP中模拟asp的response类 习惯了asp或是asp.net开发的人, 他们会经常用到response类,这个类用于处理客户端的相应,可以实现跳转,输出等功能. 在php中没有这个类,但是 ...

  6. 在GNS3中模拟交换机和PC

    在GNS3中模拟交换机和PC (声明:本博客中所有文章仅用于学习交流,学识有限,错误难免,欢迎回帖批评指正,期待与你的交流.) 一.目标:使用ios c3640交换模块,模拟交换机 二.使用VPCS模 ...

  7. oracle模块损坏,Oracle中模拟及修复数据块损坏

    Oracle中模拟及修复数据块损坏,itpub link: http://www.itpub.net/showthread.php?threadid=201766[@more@]Oracle中模拟及修 ...

  8. OpenGL在frag着色器中模拟手电筒效果

    在[OpenGL在frag着色器中模拟点光源]的基础上进行修改,得到手电筒效果(https://blog.csdn.net/qq_37340753/article/details/105029079) ...

  9. 在 MFC SDI 程序中实现多语言程序界面

    下载: SdiML (34K,Visual C++ 6 项目) 今天举个例子,说说怎样使用 CLanguage 类,在 MFC SDI 程序中实现多语言程序界面. 因为 MFC 包装了一些字符串显示处 ...

最新文章

  1. Java实用教程笔记 Java入门
  2. 12C OCP 1Z0-063 题库(8月以前)
  3. linux kernel defconfig和.config
  4. Html、CSS、JavaScript 实时效果在线编辑器 - 学习的好工具,算不算?!
  5. 网站服务器在境外境内怎么维护,涉黄网站服务器移至境外 境内维护人员将受制裁...
  6. Windows Server 2008 R2 Server Core文件操作命令
  7. pandas merge融合
  8. 机器字长 存储字长 指令字长 机器字长
  9. namenode双机热备之操作实践
  10. 实际波动率与隐含波动率的计算 python
  11. c语言水仙花数pow,c语言如何解水仙花数
  12. 【Linux】区分Ubuntu桌面版本和服务器版本
  13. 华为操作系统 28 年史
  14. 人工智能时代,主要带来的变革有哪些?
  15. srm软件非生产采购的解决方案
  16. npm没有权限,显示no such file or directory
  17. 时间序列论文:Multi-Scale Convolutional Neural Networks
  18. Apache Commons Lang3 DateUtils用法
  19. 广州住房公积金管理中心综合业务管理系统容灾项目(GZIT2010-ZB0103)招标公告...
  20. 我国信息安全发展历程及相关产业链分析

热门文章

  1. java 打不开空客手册_空客A320AMM维护手册使用介绍.ppt
  2. 一名合格的电子工程师,不能逃避的“梗”
  3. vertx web连接超时 阻塞_Flink之基于Vertx的Mysql异步IO
  4. python3安装_Python 3.8.2安装教程
  5. chinaren校友录恢复重新开放_确定!九寨沟景区9月27日对外开放(试运行) 最大限量为每天5000人 各大旅企产品已上线...
  6. 微型计算机的主要硬件以及技术指标,微型计算机主要技术指标
  7. 搞怪的html代码,这个恶搞网页代码是肿么写出来的?
  8. 惠普台式计算机系统系统修复,惠普电脑系统如何恢复【方法步骤】
  9. mysql 5.6 使用ssl_MySQL 5.6--------SSL连接最佳实战
  10. vue项目开发实战案例_Vue、Spring Boot开发小而完整的Web前后端分离项目实战02