当前位置: 首页 > news >正文

pywinauto操作windows应用(未完成)

pywinauto 脚本制作

一 、获取窗口句柄

首先获取句柄,其次扫描组件,然后对按钮和文本进行操作

安装依赖

pip install pywin32 -i https://pypi.doubanio.com/simple

扫描全部的句柄

import win32gui# GetDesktopWindow 获得代表整个屏幕的一个窗口(桌面窗口)句柄
hd = win32gui.GetDesktopWindow()# 获取所有子窗口
hwndChildList = []
win32gui.EnumChildWindows(hd, lambda hwnd, param: param.append(hwnd), hwndChildList)for hwnd in hwndChildList:print("句柄:", hwnd, "标题:", win32gui.GetWindowText(hwnd))# f.write("句柄:" + str(hwnd) + " 标题:" + win32gui.GetWindowText(hwnd) + '\n'

将句柄写入文本

lst = [1, 2, 3]
str_lst = [str(item) for item in lst]
# 假设有一个列表
my_list = ['这', '是', '一个', '测试']# 将列表中的每个元素转换为字符串,并用换行符连接
list_as_string = '\n'.join(my_list)# 打开文件进行写入
with open('output.txt', 'w', encoding='utf-8') as file:file.write(list_as_string)

最终写入

def find_all_window():hd = win32gui.GetDesktopWindow()# 获取所有子窗口hwnd_child_list = []win32gui.EnumChildWindows(hd, lambda hwnd, param: param.append(hwnd), hwnd_child_list)str_list = []for hwnd in hwnd_child_list:print("句柄:", hwnd, "标题:", win32gui.GetWindowText(hwnd))str_list.append("句柄:" + str(hwnd)+"标题:" + win32gui.GetWindowText(hwnd))# f.write("句柄:" + str(hwnd) + " 标题:" + win32gui.GetWindowText(hwnd) + '\n'# 将句柄生成文件list_as_string = '\n'.join(str_list)# 打开文件进行写入with open('output.txt', 'w', encoding='utf-8') as file:file.write(list_as_string)

在文件中查询到

句柄:267410标题:
句柄:1905680标题:
句柄:1512536标题:Import Excel File V1.0
句柄:332172标题:
句柄:70010标题:
句柄:70002标题:CWebviewHostWnd
句柄:70004标题:
句柄:70018标题:Chrome Legacy Window其中Import Excel File V1.0的句柄为
句柄:1512536标题:Import Excel File V1.0

使用句柄查找应用窗口, 并前置

# 将查询的窗口前置,handle是句柄
def preposition_windows(handle):hwnd = win32gui.FindWindow(0, win32gui.GetWindowText(handle))  # 寻找窗口if not hwnd:print("找不到该窗口")else:win32gui.SetForegroundWindow(hwnd)  # 前置窗口

完整代码

import win32gui
import win32con
import pyautogui
from pynput import keyboard, mouse
from loguru import logger
from threading import Thread
import time
import re
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl import styles
from openpyxl.styles import *
import pandas as pd
import string
import re
import os
import datetimedef find_all_window():hd = win32gui.GetDesktopWindow()# 获取所有子窗口hwnd_child_list = []win32gui.EnumChildWindows(hd, lambda hwnd, param: param.append(hwnd), hwnd_child_list)str_list = []for hwnd in hwnd_child_list:print("句柄:", hwnd, "标题:", win32gui.GetWindowText(hwnd))str_list.append("句柄:" + str(hwnd)+"标题:" + win32gui.GetWindowText(hwnd))# f.write("句柄:" + str(hwnd) + " 标题:" + win32gui.GetWindowText(hwnd) + '\n'# 将句柄生成文件list_as_string = '\n'.join(str_list)# 打开文件进行写入with open('output.txt', 'w', encoding='utf-8') as file:file.write(list_as_string)# 将查询的窗口前置,handle是句柄
def preposition_windows(handle):hwnd = win32gui.FindWindow(0, win32gui.GetWindowText(handle))  # 寻找窗口if not hwnd:print("找不到该窗口")else:win32gui.SetForegroundWindow(hwnd)  # 前置窗口# 通过名字查询句柄
# hwnd = win32gui.FindWindow(None, "窗口标题")
if __name__ == '__main__':# 查询所有窗口,当名字查不到句柄时,使用# find_all_window()# 函数hwnd = win32gui.FindWindow(None, "frm_ImportExcel")# 显示窗口# win32gui.ShowWindow(hwnd, win32con.SW_SHOW)# win32gui.SetForegroundWindow(hwnd)  # 前置窗口handle = 1643806前置窗口preposition_windows(handle)

注意

应用名称和窗口名称不同

通过窗口名称返回句柄(最好的方法)

import win32gui
import win32conif __name__ == '__main__':# 查询所有窗口,当名字查不到句柄时,使用# find_all_window()# 函数hwnd = win32gui.FindWindow(None, "frm_ImportExcel")# 显示窗口win32gui.ShowWindow(hwnd, win32con.SW_SHOW)win32gui.SetForegroundWindow(hwnd)  # 前置窗口print(hwnd)

二、查询窗口的控件

#Only for Windows!!!!
import win32gui as wg #pip install pypiwin32
result = []
handle = wg.FindWindow(classname, name) #classname是窗口类名,name是窗口名,可以只写一个,另一个为None,也可以两个都写
def callback(handle, res):result.append(handle)return True
wg.EnumChildWindows(handle, callback, None)
#result就是控件名

获取树形控件的句柄

获取活动窗口的句柄

# 获取当前活动窗口句柄
hParent = win32gui.GetForegroundWindow()
# 获取TreeView句柄
hTreeView = win32gui.FindWindowEx(hParent, 0, "SysTreeView", None)
# 获取选中项的标题
selectedIndex = win32gui.SendMessage(hTreeView, win32con.TVM_GETNEXTITEM, win32con.TVGN_CARET, 0)
title = win32gui.SendMessage(hTreeView, win32con.TVM_GETITEMTEXT, selectedIndex, buffer)

测试连接

	# 验证是否找到窗口win32gui.ShowWindow(hwnd, win32con.SW_SHOW)win32gui.SetForegroundWindow(handle)  # 前置窗口

在这段代码中,selectedIndex是选中项的索引,title是选中项的标题。win32gui.SendMessage函数用于发送消息给TreeView控件,win32con.TVM_GETNEXTITEM和win32con.TVM_GETITEMTEXT是获取下一个项和获取项文本的消息常量。win32con.TVGN_CARET表示获取当前选中项的常量

通过spy++获取类名,然后通过

# 获取TreeView类名获取句柄
hTreeView = win32gui.FindWindowEx(hParent, 0, "SysTreeView", None)

初识UI自动化(inspect.exe + uiautomation)

https://blog.csdn.net/knighthood2001/article/details/124297008

UI Spy.exe 快速获取窗口或控件的属性信息(免C币免积分下载)

https://blog.csdn.net/weixin_39927850/article/details/126243682

Python UI自动化-UIAutomation之Inspect下载

https://blog.csdn.net/weixin_52770263/article/details/129957439

三、pywinauto元素定位和操控(联合inspect.exe)

教程

pywinauto
https://blog.csdn.net/weixin_42753043/article/details/123962834
PC端windows自动化:pywinauto(一)安装和打开程序
https://blog.csdn.net/m0_67761286/article/details/128014397

下载 pywinauto对控件进行操作

pip install pywinauto -i https://pypi.doubanio.com/simple

导入依赖

from pywinauto import Application
from pywinauto import findwindows

查询软件句柄

通过inpect.exe查出软件属性如下

name = frm_ImportExcel
class_name = Tfrm_ImportExcel

代码连接软件如下

	# 连接app,通过窗口名称handle = win32gui.FindWindow(None, "frm_ImportExcel")# 使用uia模式,访问更多的标签app = Application(backend="uia").connect(handle=handle)

测试连接

	# 验证是否找到窗口win32gui.ShowWindow(hwnd, win32con.SW_SHOW)win32gui.SetForegroundWindow(handle)  # 前置窗口

操控树组件

查询窗口

app.top_window() # 返回应用程序当前顶部窗口,是WindowSpecification对象,可以继续使用对象的方法往下继续查找控件
# eg:如:app.top_window().child_window(title='地址和搜索栏', control_type='Edit')
app.window(**kwargs) # 根据筛选条件,返回一个窗口, 是WindowSpecification对象,可以继续适用对象的方法往下继续查找控件
# eg: 微信主界面 app.window(class_name='WeChatMainWndForPC')
app.windows(**kwargs) # 根据筛选条件返回一个窗口列表,无条件默认全部,列表项为wrapped(装饰器)对象,可以使用wrapped对象的方法,注意不是WindowSpecification对象
# eg:[<uiawrapper.UIAWrapper - '李渝的早报 - Google Chrome', Pane, -2064264099699444098>]
app.kill(soft=False) # 强制关闭
app.cpu_usage() # 返回指定秒数期间的CPU使用率百分比
app.wait_cpu_usage_lower(threshold=2.5, timeout=None, usage_interval=None) # 等待进程CPU使用率百分比小于指定的阈值threshold
app.is64bit() # 如果操作的进程是64-bit,返回True

查询元素

	# 查询app窗口,通过窗口名dlg = app["frm_ImportExcel"]# dlg.print_control_identifiers()# 查询树tree_view = dlg.child_window(class_name='TRzTreeView')# 展开树节点# 画方框圈住元素tree_view.draw_outline()#tree_view.print_control_identifiers()# 选择零售销货单tree_view.child_window(title="[80802003]零售退货单", control_type="TreeItem").select()

在窗口下继续查询组件

完整代码 pywinauto

import win32gui
import win32con
import win32api
import pyautogui
from pynput import keyboard, mouse
from loguru import logger
from threading import Thread
import time
import re
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl import styles
from openpyxl.styles import *
import pandas as pd
import string
import re
import os
import datetime
import time
from pywinauto import Application
from pywinauto import findwindowsdef find_all_window():hd = win32gui.GetDesktopWindow()# 获取所有子窗口hwnd_child_list = []win32gui.EnumChildWindows(hd, lambda hwnd, param: param.append(hwnd), hwnd_child_list)str_list = []for hwnd in hwnd_child_list:print("句柄:", hwnd, "标题:", win32gui.GetWindowText(hwnd))str_list.append("句柄:" + str(hwnd) + "标题:" + win32gui.GetWindowText(hwnd))# f.write("句柄:" + str(hwnd) + " 标题:" + win32gui.GetWindowText(hwnd) + '\n'# 将句柄生成文件list_as_string = '\n'.join(str_list)# 打开文件进行写入with open('output.txt', 'w', encoding='utf-8') as file:file.write(list_as_string)# 将查询的窗口前置,handle是句柄
def preposition_windows(handle):hwnd = win32gui.FindWindow(0, win32gui.GetWindowText(handle))  # 寻找窗口if not hwnd:print("找不到该窗口")else:win32gui.SetForegroundWindow(hwnd)  # 前置窗口def find_control(handle):result = []# class_name是窗口类名,name是窗口名,可以只写一个,另一个为None,也可以两个都写# handle = wg.FindWindow(class_name, name)def callback(handle, res):result.append(str(handle) + ": " + win32gui.GetWindowText(handle))return Truewin32gui.EnumChildWindows(handle, callback, None)return result# result就是控件名if __name__ == '__main__':# 查询所有窗口,当名字查不到句柄时,使用# find_all_window()# 连接app,通过窗口名称handle = win32gui.FindWindow(None, "frm_ImportExcel")# 使用uia模式,访问更多的标签app = Application(backend="uia").connect(handle=handle)# 验证是否找到窗口win32gui.ShowWindow(handle, win32con.SW_SHOW)win32gui.SetForegroundWindow(handle)  # 前置窗口# time.sleep(2)# 查询app窗口,通过窗口名dlg = app["frm_ImportExcel"]# dlg.print_control_identifiers()# 查询树tree_view = dlg.child_window(class_name='TRzTreeView')# 展开树节点# 画方框圈住元素tree_view.draw_outline()#tree_view.print_control_identifiers()# 选择零售销货单tree_view.child_window(title="[80802003]零售退货单", control_type="TreeItem").select()# 等待元素加载time.sleep(2)# 查找工具栏tool_bar = dlg.child_window(class_name='TToolBar')# 画方框圈住元素tool_bar.draw_outline()# 展开组件tool_bar.print_control_identifiers()# 点击新增tree_view.child_window(title="[80802003]零售退货单", control_type="TreeItem").select()tool_bar.child_window(title="新增", control_type="Button").click_input()# 输入信息# 点击导入time.sleep(1)tool_bar.child_window(title="导入", control_type="Button").click_input()time.sleep(2)

相关文章:

pywinauto操作windows应用(未完成)

pywinauto 脚本制作 一 、获取窗口句柄 首先获取句柄&#xff0c;其次扫描组件&#xff0c;然后对按钮和文本进行操作 安装依赖 pip install pywin32 -i https://pypi.doubanio.com/simple扫描全部的句柄 import win32gui# GetDesktopWindow 获得代表整个屏幕的一个窗口&a…...

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件&#xff1a;将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上&#xff08;因安装exe4…...

学习软考----数据库系统工程师29

数据操作 SELECT基本结构 简单查询 连接查询 子查询 聚集函数 分组查询 字符串操作 集合操作 外连接 INSERT INTO语句 DELETE语句 UPDATE语句...

STL中的优先级队列

目录 1.引言 2.简介 3.基本操作 4.实现原理 5.自定义优先级比较 6.相关题目 7.能特点 8.总结 1.引言 在C标准库中&#xff0c;优先级队列是一种非常有用的数据结构&#xff0c;它允许我们根据元素的优先级来对其进行排序和访问。这种数据结构在多种应用场景中都发挥着重…...

浅谈Acrel-2000ES储能能量管理系统的设计与应用-安科瑞 蒋静

0 前言 为进一步提升河南省分布式光伏发电发展水平&#xff0c;促进行业健康可持续发展&#xff0c;河南省发布关于促进分布式光伏发电健康可持续发展的通知。对于储能行业&#xff0c;可以用到安科瑞Acrel-2000ES储能能量管理系统。 储能柜EMS能量管理系统 1、产品名称 储…...

会员卡积分小程序系统源码商业运营版 行业一站式解决方案附带源代码以及搭建安装部署教程

系统概述 会员卡积分小程序系统源码商业运营版是一套完整的会员卡积分系统解决方案&#xff0c;包含前端小程序、后端管理系统以及数据库设计。该系统支持多种会员卡类型、积分规则设定、积分兑换、优惠券发放等功能&#xff0c;满足企业对于会员积分管理的各种需求。同时&…...

uniapp 百度地图 拖动获取经纬度级搜索连用

import loadBMap from /utils/loadBMap.js// 百度聚合具体代码 // 拖动 initMapc() {let that thisloadBMap(百度key).then(() > {map new BMap.Map(mapContainer)const centerPoint new BMap.Point(this.longitude, this.latitude)map.centerAndZoom(centerPoint, this.…...

Yarn的安装和使用详细教程(Mac/Window)

目录 Yarn是什么&#xff1f; Mac安装Yarn 使用Homebrew安装Yarn 使用npm安装Yarn Windows安装Yarn 使用npm安装Yarn Yarn使用 常用命令&#xff1a; 特殊命令&#xff1a; Yarn是什么&#xff1f; Yarn是一个流行的包管理工具&#xff0c;用于管理JavaScript项目的依…...

高考志愿系统-学生管理模块分析

1.获取学生信息&#xff1a; 接口&#xff1a;http://localhost:81/dev-api/college_entrance/student/list?pageNum1&pageSize10 请求方式get 默认传参pageNum和pageSize&#xff0c;表示当前页&#xff0c;每页展示数量 首先通过startPage()方法获取分页参数当前页&…...

【问题实操】银河高级服务器操作系统实例分享,开机之后反复重启

1.服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器&#xff1a; PHYTIUM FT2000PLUS 2200 MHz 内存&#xff1a; 128 GiB 整机类型/架构&#xff1a; HIKVISION DS-V BIOS版本&#xff1a; HK 601FBE02HK 网卡&#xff1…...

攻防世界-web-unseping

题目 知识点 PHP代码审计PHP序列化和反序列化PHP中魔术方法命令执行绕过方式 解读源码 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function …...

网络网络层之(4)IPv4协议

网络网络层之(1)IPv4协议 Author: Once Day Date: 2024年4月4日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…...

16-LINUX--线程安全

一。线程安全 线程安全即就是在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 要保证线程安全需要做到&#xff1a; 1&#xff09; 对线程同步&#xff0c;保证同一时刻只有一个线程访问临界资…...

Flask SQLAlchemy 技术指南

文章目录 什么是 Flask SQLAlchemy&#xff1f;安装 Flask SQLAlchemy创建 Flask 应用和数据库模型添加和查询数据运行 Flask 应用总结**数据库迁移&#xff08;Database Migrations&#xff09;****复杂查询****关系模型****事务处理****性能优化****安全性****扩展功能** Fla…...

js通过时间对JSON中的数据进行排序

需求 现在需要通过每一个数据段的date字段对数组的整体数据进行排序&#xff01; 元数据如下&#xff1a; var data [{"filename": "123","date": "2024-05-10 19:53:57","stand": "GB-14","filter":…...

leetcode206-Reverse Linked List

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 分析 用一个指针记录当前位置&#xff0c;另外一个指针记录当前位置的前一个位置&#xff0c…...

云计算第十二课

安装虚拟机 第一步新建虚拟机 选择自定义安装 下一步 选择稍后安装操作系统 选择系统类型和版本 选择虚拟机文件路径&#xff08;建议每台虚拟机单独存放并且路径不要有中文&#xff09;点击下一步 选择bios下一步 选择虚拟机处理器内核数量 默认硬盘或者自行调大硬盘 选择虚…...

【elasticsearch】慢查询替代查询审计的尝试

【elasticsearch】慢查询替代查询审计的尝试 使用了es有两年了&#xff0c;突然发现一个&#xff0c;es没有查询审计日志&#xff0c;某个用户查询了某个索引的审计。 找了官方文档和社区的回复都是说使用slow log替代慢查询。 尝试一下。 参考链接1&#xff1a;https://discus…...

腐烂的橘子BFS

题目&#xff1a; 腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子…...

什么是分库分表

读写分离主要应对的是数据库读并发&#xff0c;没有解决数据库存储问题。试想一下&#xff1a;如果 MySQL 一张表的数据量过大怎么办? 答案当然是分库分表 什么是分库&#xff1f; 分库 就是将数据库中的数据分散到不同的数据库上&#xff0c;可以垂直分库&#xff0c;也可…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...