新用户注册入口 老用户登录入口

[转载]python文件怎么另存为_python+pywin32处理另存为弹出框保存文件

文章作者:转载 更新时间:2023-12-17 22:46:11 阅读数量:252
文章标签:文件另存为弹出框句柄输入文件名修改路径自动化操作
本文摘要:这篇文章详细介绍了如何利用Python的win32gui模块实现对“文件另存为”弹出框的自动化控制,通过查找窗口句柄精确定位到输入框以实现文件名自动填写,并解决了保存路径修改与取消按钮点击无效的问题。文章演示了如何逐层查找子窗口、模拟按键操作(如WM_SETTEXT、WM_KEYDOWN等)以及鼠标事件(如鼠标左键点击),最终成功实现在不改变默认保存路径的情况下直接保存文件,并能有效进行路径修改和点击取消按钮的操作。关键词包括:win32gui、文件另存为、弹出框、句柄、输入文件名、模拟按键点击、修改路径、SendMessage、窗口句柄查找及取消按钮。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39814378/article/details/110329291。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1.首先先定位该弹出框

用spy++查找到该弹出框的标题和类名:

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

弹出框的句柄是每次都会变的,所以通过标题和类名获取该句柄:

# 获取另存为弹出框

calssname = u"#32770"

titlename = u"文件另存为"

hwnd = win32gui.FindWindow(calssname,titlename)

2.输入文件名

输入框定位在多层窗口的下面,所以我是一层一层往下找的,没找到便捷的方法

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

# 获取文件名输入框

a1 = win32gui.FindWindowEx(hwnd,None,"DUIViewWndClassName",None)

a2 = win32gui.FindWindowEx(a1,None,"DirectUIHWND",None)

a3 = win32gui.FindWindowEx(a2,None,"FloatNotifySink",None)

a4 = win32gui.FindWindowEx(a3,None,"ComboBox",None)

hwnd_filename = win32gui.FindWindowEx(a4,None,"Edit",None)

#在文件名输入框中输入文件名(fileName输入一个字符串,我根据系统需要生成的随机数,汉字的话需要转码,如u'你好'.encode('gbk'))

win32gui.SendMessage(hwnd_filename, win32con.WM_SETTEXT, None, fileName)

3.点击保存

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

# 点击保存按钮

hwnd_save = win32gui.FindWindowEx(hwnd,None,"Button",None)

win32gui.PostMessage(hwnd_save, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

win32gui.PostMessage(hwnd_save, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

以上在不需要修改保存路径的情况下可以直接保存文件

---------------------------------------------------------------------------------------------------------------------------

以下是未解决的问题

1.修改路径的问题(已解决),我猜想是通过两种方式,一是通过左边的树视图(SysTreeView32)来操作选择路径,二是通过在地址栏直接输入路径地址。其中第一种方法在网上没有查找到操作的方法,然后尝试第二种方法,找到路径地址输入框然后输入路径:

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

未点击地址栏时路径的窗口句柄是上图这样的

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

点击地址栏之后路径窗口句柄变成下图这样

a1 = win32gui.FindWindowEx(hwnd,None,"WorkerW",None)

a2 = win32gui.FindWindowEx(a1,None,"ReBarWindow32",None)

a3 = win32gui.FindWindowEx(a2,None,"Address Band Root",None)

a4 = win32gui.FindWindowEx(a3,None,"msctls_progress32",None)

a5 = win32gui.FindWindowEx(a4,None,"Breadcrumb Parent",None)

hwnd_filepath1 = win32gui.FindWindowEx(a5,None,"ToolbarWindow32",None)

print "-----hwnd_filepath1------",hwnd_filepath1

先找到到上图路径栏句柄(查找成功),然后按回车,使地址栏变成可输入状态

win32gui.PostMessage(hwnd_filepath1, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)

win32gui.PostMessage(hwnd_filepath1, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)

在通过路径查找

a11 = win32gui.FindWindowEx(hwnd,None,"WorkerW",None)

a21 = win32gui.FindWindowEx(a11,None,"ReBarWindow32",None)

a31 = win32gui.FindWindowEx(a21,None,"Address Band Root",None)

a41 = win32gui.FindWindowEx(a31,None,"msctls_progress32",None)

a6 = win32gui.FindWindowEx(a41,None,"ComboBoxEx32",None)

a7 = win32gui.FindWindowEx(a6,None,"ComboBox",None)

hwnd_filepath = win32gui.FindWindowEx(a7,None,"Edit",None)

print "-----hwnd_filepath------",hwnd_filepath

到这一步查找句柄返回值变成0,就是没查找到路径编辑框,没有找到原因,代码运行下来路径那里只是能看到的效果点击了一下,但是不会变成输入框状态,但是把鼠标移上去会变成输入的状态

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

这样是可输入的状态

然后win32gui.SendMessage(hwnd_filepath, win32con.WM_SETTEXT, None, 'C:\Users\Administrator\Desktop')这样地址就输入不进去,原因不明

视图数操作的方法没有找到

2.取消按钮的点击无效(已解决)

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

保存按钮

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

取消按钮

保存和取消的类名都是“Button”,所以通过保存按钮查找到下一个Button就是取消

hwnd_cancle = win32gui.FindWindowEx(hwnd,hwnd_save,"Button",None)

print "------hwnd_cancle---",hwnd_cancle

取消句柄获取到了,通过下面的方法打印出来的父句柄和保存按钮是一样的都是另存为这个弹出框

print win32gui.GetParent(hwnd_cancle)

下面两行代码也获取到了取消的类名和标题打印出来的是‘Button’和‘取消’

print win32gui.GetClassName(hwnd_cancle)

print win32gui.GetWindowText(hwnd_cancle).decode('gbk').encode('utf-8')

以下两行代码点击取消按钮的时候,弹出框不关闭,然后发现点击的是保存按钮,原因不明

win32gui.PostMessage(hwnd_cancle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)

win32gui.PostMessage(hwnd_cancle, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

以上是完成的两点和处理失败的两点,做出来是个半成品,win32gui这方面的知识对我来说有点难,在python中安装的pywin32自带了一个API,里面的描述方法很简单,不够详细,很多看不太懂,以后还需要再花时间慢慢研究

--------------------------------------------------------------------------------------------

问题1的解决方法:

# 修改成指定路径

win_1 = win32gui.FindWindowEx(hwnd, None,"WorkerW",None)

win_2 = win32gui.FindWindowEx(win_1, None,"ReBarWindow32",None)

win_3 = win32gui.FindWindowEx(win_2, None,"Address Band Root",None)

win_4 = win32gui.FindWindowEx(win_3, None,"msctls_progress32",None)

left, top, right, bottom = win32gui.GetWindowRect(win_4)

win32api.SetCursorPos([left,top])

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

# 将路径复制到剪切板

win32clipboard.OpenClipboard()

win32clipboard.EmptyClipboard()

win32clipboard.SetClipboardText(filePath)

win32clipboard.CloseClipboard()

# 按下ctrl+v

win32api.keybd_event(0x11, 0, 0, 0)

win32api.keybd_event(0x56, 0, 0, 0)

win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)

win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)

# 按回车进入该路径

win32api.keybd_event(0x0D,0,0,0)

问题2取消按钮点击的问题已经解决:

# 点击取消按钮,用鼠标点击点击取消按钮,上面使用键盘按键不行,原因不明

hwnd_cancel = win32gui.FindWindowEx(hwnd,hwnd_save,"Button",None)

left, top, right, bottom = win32gui.GetWindowRect(hwnd_cancel)#该方法接收值必须为4个

win32api.SetCursorPos([left+35,top+13])

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

win32gui.GetWindowRect方法描述:Returns the rectangle for a window in screen coordinates。应该返回该句柄控件的四个顶点坐标吧

win32api.SetCursorPos方法描述:The SetCursorPos function moves the cursor to the specified screen coordinates.将光标移动到指定的屏幕坐标。

-----------------------------------------------------------------------------------------------

查找另存为弹出框下的所有子句柄:

hwndChildList = []

win32gui.EnumChildWindows(hwnd, lambda hwnd1, param: param.append(hwnd1),  hwndChildList)

for a in hwndChildList:

print win32gui.GetParent(a)

print win32gui.GetClassName(a)

print win32gui.GetWindowText(a).decode('gbk').encode('utf-8')

print "-----hwnd_save------",a

另外,经同事推荐ViewWizard工具比spy++更轻便快捷,查看父句柄也比之更方便

按键控制查询:http://www.mamicode.com/info-detail-1319197.html

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4192331ce88d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39814378/article/details/110329291。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
win32guiwin32gui是Python的一个库,用于访问和控制Windows操作系统的图形用户界面(GUI)元素。在本文的语境中,作者使用win32gui模块来定位和操作“文件另存为”弹出框中的各个窗口组件,如获取窗口句柄、模拟按键输入以及点击按钮等,实现对这一对话框的自动化控制。
句柄在Windows编程中,句柄是一种抽象的指针,它代表了系统内部资源的一种唯一标识符。在文章中,作者通过查找并获取弹出框及其子控件的句柄,从而能够精确地与这些窗口组件进行交互。例如,通过找到文件名输入框的句柄,进而可以向该输入框发送消息以实现自动输入文件名。
SendMessage函数SendMessage是Windows API中一个用于向指定窗口发送消息的函数。在文中,作者利用win32gui模块封装的SendMessage方法,向特定窗口句柄发送WM_SETTEXT消息,以此实现在“文件另存为”对话框的文件名输入框中设置文本内容。具体而言,SendMessage(hwnd, message, wParam, lParam)这四个参数分别代表目标窗口句柄、要发送的消息类型、两个附加参数,其中在本文情境下message参数设为WM_SETTEXT,wParam和lParam通常设为None,而将待输入的文件名字符串作为实际消息内容传递。
窗口类名在Windows操作系统中,每个窗口都有一个类名,它是创建窗口时定义的,用来区分不同类型的窗口。在文中,作者通过查找窗口的类名来识别特定的“文件另存为”弹出框和其他相关控件,比如ComboBox、Edit或Button等,以便精确操控这些窗口组件完成自动化任务。
模拟按键点击模拟按键点击是指在程序中模拟用户的键盘或鼠标动作,使得程序可以如同真实用户一样与应用程序交互。在本文中,作者使用win32api模块提供的keybd_event函数模拟按下Enter键和Ctrl+V键等操作,以实现路径选择和回车确认的功能,还通过mouse_event函数模拟鼠标左键单击事件,来点击取消按钮,这些都是对用户交互行为的自动化模拟。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在深入探讨Python win32gui模块实现对“文件另存为”弹出框的自动化操作后,我们可以进一步探索这一技术在实际应用场景中的广泛潜力。近期,随着RPA(Robotic Process Automation)技术的发展与普及,越来越多的企业开始利用类似的技术优化办公流程,实现日常任务的自动化处理。例如,在大量数据导入导出、系统间信息同步等场景中,精确控制Windows对话框以自动完成文件保存动作,能够显著提升工作效率并减少人为错误。
事实上,Python的win32库不仅仅局限于简单的窗口句柄查找和消息模拟发送,还可以用于更复杂的桌面应用程序自动化,如自动化测试、GUI应用脚本编写等。同时,对于无障碍技术领域而言,通过精准控制各类对话框组件,可以辅助残障人士进行计算机操作,为其提供便利。
另外,值得注意的是,尽管win32gui提供了强大的本地化操作能力,但在跨平台兼容性和未来发展趋势上,开发者也应关注像PyAutoGUI、Selenium等更为现代化且支持多平台的自动化工具包。这些工具不仅同样支持窗口控件的定位与交互,还能够无缝对接Web应用和移动应用的自动化测试与操作。
综上所述,对win32gui模块的深入理解和熟练运用,既有助于我们解决实际工作中的自动化需求,也能启发我们思考如何在更广阔的自动化技术领域拓展应用。同时,结合最新的自动化工具和技术动态,我们将更好地应对日益复杂的应用场景挑战,不断推动软件自动化技术的进步与发展。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
tail -f /var/log/messages - 实时监控日志文件末尾的新内容。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
可自定义logo的jQuery生成二维码插件 01-03 jquery每日签到日历插件 10-10 高度可定制的jQuery瀑布流网格布局插件 03-15 Consul中服务实例自动注销问题解析:健康检查、稳定性与Agent配置的影响及解决策略 01-22 怎么看mysql 的安装路径 12-31 jquery横向手风琴效果 12-23 蓝色数码电子产品销售HTML5网站模板 12-14 jQuery和CSS3汉堡包导航菜单打开动画特效 10-19 python模拟生存游戏 10-08 本次刷新还10个文章未展示,点击 更多查看。
jQuery.eraser-实现橡皮擦擦除功能的jquery插件 05-26 Netty中ChannelNotRegisteredException异常处理:理解原因与确保Channel注册状态的方法示例 05-16 响应式游戏开发类企业前端cms模板下载 05-02 精美的花甲美食网站HTML模板下载 03-09 soulmate粉色干净浪漫唯美婚礼单页响应式网站模板 03-07 Vue.js项目中proxyTable数据转发遭遇504错误:服务器响应时间与网络连接问题排查及解决方案 03-05 SpringCloud服务路由配置错误与失效:识别问题、排查步骤及组件解析这个涵盖了的核心内容,包括SpringCloud框架下的服务路由配置错误失效问题的识别,以及涉及到的服务注册中心、Gateway、Zuul等组件的功能解析和故障排查的具体步骤。同时,字数控制在了50个字以内,满足了要求。 03-01 css水平线长度设置 02-11 [转载]Proxy 、Relect、响应式 01-11 蓝色响应式软件营销代理公司网站静态模板 01-06 python正太分布校验 01-05
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"