背景--为什么要自动化操作?

工作中总是遇到反复重复性的工作?怎么用程序把它变成自动化操作?将程序挂在一旁,执行自动化操作的同时,还能处理其他的任务?提高工作效率,让自己的时间变得可控?

只能运用于 MFC 和 windows 消息机制下

最近的工作中,遇到了需要比对c++程序的运行结果与matlab运行结果的事项。

目前需要校验的c++程序并没用引入软件测试这一步骤,需要手动去操作程序获取数据,由于数据量比较大,想考虑使用程序自动运行。

偶然间想到了可以给MFC发送消息,实现软件模拟手工操作来完成这项工作。

方法--怎么实现自动化操作?

操作C++程序(模拟手动点击输入等等)

操作 windows 程序主要是利用了 windows 的消息机制,用程序向程序发送消息的方式替代人工点击输入操作。那怎么去使用呢?

  1. 找到 windows 的窗体,需要利用 windows 的查找窗口 FindWindowEx 这个 api
  2. 点击按钮的操作,需要使用 PostMessage 这个 windows api
  3. 设置输入文本,需要使用 SendMessage 这个 windows api
  4. 关闭对话框,需要发送 WM_CLOSE 的消息

查找窗体

查找窗体是这个操作很重要的一步,对话框上的按钮、文本框等等都是窗体,都需要使用 FindWindowEx 去进行查找。

只有找到了需要控制的窗体,才能执行下面的控制操作。

参考资料:FindWindowEx

import win32gui
import time def FindWindow(parent_wid,child_after_wid,class_name,window_name,try_cnt=100):
openid = 0
cnt = 0
while not openid and cnt < try_cnt:
openid = win32gui.FindWindowEx(parent_wid,child_after_wid,class_name,window_name)
time.sleep(0.2)
cnt+=1
if cnt >= try_cnt:
print('"%s->%s" not found!' % (class_name,window_name))
else:
print('"%s->%s" found!' % (class_name, window_name))
return openid

操作方法

可以使用 visual studio 的 spy++ 工具来检索窗体的名称,如下为windows

openid = win32gui.FindWindowEx(None,None,None,'windows')

发送消息

发送消息主要涉及 PostMessageSendMessage 这两个发送消息的 api。

其中 PostMessage 为异步发送,发送消息立刻返回。

SendMessage 为同步发送,等到消息被处理才返回。

参考资料:

PostMessage

SendMessage

  1. 点击窗体

    鼠标的点击操作是我们最常用的一个操作,主要是向窗体发送 WM_LBUTTONDOWN 加上 WM_LBUTTONUP 这两个消息来模拟鼠标左键按下和松开的操作。
save_as_wid = FindWindow(None, None,None,'确认另存为',10)
btn_wid = FindWindow(save_as_wid, None,'Button','是(&Y)') if save_as_wid else 0
if btn_wid:
win32gui.PostMessage(btn_wid, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON,0)
time.sleep(0.02)
win32gui.PostMessage(btn_wid, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON,0)
  1. 菜单操作

    菜单操作也算一个鼠标的点击操作,但是却和鼠标操作不太一样。

    要进行菜单操作得知道我们要操作的菜单资源值是多少。

首先要找到窗体,假设窗体名字是 'windows'。

然后在C++源码中找到需要操作的菜单的资源值 45046。

最后向窗体发送 WM_COMMAND 消息,这时就完成了菜单的点击操作。

hid = FindWindow(None, None,None,'windows')
win32api.PostMessage(hid,win32con.WM_COMMAND,45046,0)
  1. 设置文本

    设置文本则是模拟我们往文本框中输入的操作,向文本框窗体发送 WM_SETTEXT 的消息
win32gui.SendMessage(wid, win32con.WM_SETTEXT, None, text)

获取文本

这一部分倒是找了很久才验证成功的,现在已经可以正确地读取文本内容。

主要是从一个窗体中,获取窗体的文本。

def GetWindowText(wid):
text_length = win32gui.SendMessage(wid, win32con.WM_GETTEXTLENGTH, 0,0) + 1
buffer = '\0'*text_length
lpid = id(buffer)
buf = win32gui.PyGetMemory(lpid,text_length) win32gui.SendMessage(wid, win32con.WM_GETTEXT,text_length,buf)
address, text_length = win32gui.PyGetBufferAddressAndLen(buf)
buffer = win32gui.PyGetString(address,text_length) return buffer

总结

  1. 收获

    有时候一些突发奇想的事情,做了,慢慢地就会发展成一个对自己有用地东西。坚决不忽略自己的想法,每一件事都会默默地成为自己的能力。

    这一次的开发中,让我对 windows 消息机制的理解更进一步了,同时也让我更加地爱上 python。
  2. 想法

    这其实是一个机缘巧合,让我使用python+windows消息的方式生成效率工具。但是这个程序也是有局限性,只能用于windows消息机制的程序,其他机制的程序也许会有其他的方式实现。

    python+windows消息机制的方式也只是临时使用的工具,主要的对象还是不能进行大变更的程序的控制。

    当然最好的方式是重构原程序,向外开放接口,引入软件测试来实现上面所说的功能。

语言只是一个工具,用 python 实现的上述功能其实完全也可以用 C++ 实现

欢迎大家一起交流代码呀

工作自动化,替代手工操作,使用python操作MFC、windows程序的更多相关文章

  1. MFC Windows程序开发究竟是什么?

    MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型. 什么是MFC?MFC是微软公司出品一个Application Framew ...

  2. python操作三大主流数据库(1)python操作mysql①windows环境中安装python操作mysql数据库的MySQLdb模块mysql-client

    windows安装python操作mysql数据库的MySQLdb模块mysql-client 正常情况下应该是cmd下直接运行 pip install mysql-client 命令即可,试了很多台 ...

  3. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  4. python如何编写win程序

    python可以编写win程序.win程序的格式是exe,下面我们就来看一下使用python编写exe程序的方法. 编写好python程序后py2exe模块即可将其打包为exe程序. 实际操作过程: ...

  5. 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt

    首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 . 这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Ac ...

  6. 《Python编程快速上手 —让繁琐工作自动化》|百度网盘免费下载|Python自动化办公

    Python编程快速上手—让繁琐工作自动化 提取码:u8vj 如今,人们面临的大多数任务都可以通过编写计算机软件来完成. Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过 P ...

  7. Python编程快速上手-让繁琐工作自动化-第二章习题及其答案

    Python编程快速上手-让繁琐工作自动化-第二章习题及其答案 1.布尔数据类型的两个值是什么?如何拼写? 答:True和False,使用大写的T和大写的F,其他字母是小写. 2.3个布尔操作符是什么 ...

  8. python经典书记必读:Python编程快速上手 让繁琐工作自动化

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/69/ 来源:python黑洞网,专注 ...

  9. 入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码

    入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...

随机推荐

  1. 关于Marshal 类的整理

    在两个不同的实体(两个线程或者进程甚至机器.在Managed和Unmanaged之间)进行方法调用和参数传递的时候,具体的调用方法和参数的内存格式可能需要一定的转换,这个转换的过程叫做Marshal. ...

  2. react 结合gitte 创建项目(详情步骤)

    ​ 创建项目第一步 基本搭建 在创建之前,需要有一个git 仓库,我们要把项目搭建到git 中 目录介绍 cd 到某个盘 mkdir workspace 创建workspace文件夹 cd works ...

  3. DevOps实战(Docker+Jenkins+Git)

    基于Docker+Jenkins+Git的CI/CD实战 与上一篇随笔:基于 Jenkins+Docker+Git 的CI流程初探 有所不同,该内容更偏向于实际业务的基础需求. 有几点需要注意: 该实 ...

  4. java源码——两种格式日期的转换

    这里要实现1981.07.30 格式和July 30.1981格式的日期的转换. 在输入时进行日期格式的识别,并且对字符串进行操作并且输出. 难点在于字符串格式的识别和月份的转换,我用了正则表达式匹配 ...

  5. 【LeetCode】884. Uncommon Words from Two Sentences 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 日期 题目地址:https://leetc ...

  6. mac学习Python第二天:开发工具安装、编程方式、中文编码、syntaxError语法错误、注释、语法格式

    一.python集成开发工具Visual Studio Code安装配置 1.官网下载安装VSCode 官网地址 https://code.visualstudio.com/下载软件包 VSCode ...

  7. python-mysql-replication原理分析

    源码地址:https://github.com/noplay/python-mysql-replication 文件解析: ├── binlogstream.py ├── bitmap.py ├── ...

  8. JWT和OAuth2

    JWT是一种认证协议        JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法.令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明 ...

  9. C++函数参数的传递顺序

    C++编译器默认使用的是 __cdecl 模式,参数是通过栈传递的,因此是从右到左的传参顺序. int f(int a, int b, int c) { return 0; } int main(){ ...

  10. 更新系统为High sierra 后无法使用Cocoapods

    sudo gem update --system sudo gem install -n /usr/local/bin cocoapods执行完就可以直接用了.