1.首先先定位该弹出框:

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

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

# 获取另存为弹出框

calssname = u"#32770"

titlename = u"文件另存为"

hwnd = win32gui.FindWindow(calssname,titlename)

2.输入文件名

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

# 获取文件名输入框

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.点击保存

# 点击保存按钮

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)来操作选择路径,二是通过在地址栏直接输入路径地址。其中第一种方法在网上没有查找到操作的方法,然后尝试第二种方法,找到路径地址输入框然后输入路径:

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

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

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,就是没查找到路径编辑框,没有找到原因,代码运行下来路径那里只是能看到的效果点击了一下,但是不会变成输入框状态,但是把鼠标移上去会变成输入的状态

这样是可输入的状态

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

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

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

保存按钮

取消按钮

保存和取消的类名都是“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

python文件怎么另存为_python+pywin32处理另存为弹出框保存文件相关推荐

  1. python另存为_python+pywin32处理另存为弹出框保存文件

    1.首先先定位该弹出框: 用spy++查找到该弹出框的标题和类名: 弹出框的句柄是每次都会变的,所以通过标题和类名获取该句柄: # 获取另存为弹出框 calssname = u"#32770 ...

  2. python自动化弹框_Python+webdriver自动化脚本弹出框定位

    弹窗类型:弹出框有两种: 页面弹出框(可定位元素能操作)----div-- Windows弹出框(不能直接定位)----alert,confirm,prompt-- 一.页面弹出框 div弹窗不需要切 ...

  3. python任务栏通知区域_python+pyqt实现右下角弹出框

    本文实例为大家分享了pyqt实现右下角弹出框的具体代码,供大家参考,具体内容如下 构造函数中: self.desktop=QDesktopWidget() self.move((self.deskto ...

  4. python 控制手机摄像头_python+open cv调用手机摄像头,保存文件

    import cv2 cv2.namedWindow("camera", 1) # 开启ip摄像头 video = "http://admin:admin@192.168 ...

  5. 弹出打开/保存文件对话框 选择文件夹对话框

    打开/保存文件对话框: CFileDialog::CFileDialog(BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框LPCTSTR ...

  6. python selenium 处理弹窗_python+selenium 抓取弹出对话框信息

    抓取弹出对话框信息,困挠了我很久,我百度了很久,一直没有找到我想要的内容.最近学习到了. 有两种方法: 1.driver.switch_to.alert.text 2.result = EC.aler ...

  7. python右下角弹窗_python+pyqt实现右下角弹出框

    本文实例为大家分享了pyqt实现右下角弹出框的具体代码,供大家参考,具体内容如下 构造函数中: self.desktop=QDesktopWidget() self.move((self.deskto ...

  8. macOS下 弹出无法保存文件,请检查权限或文件是否处于只读状态

    首先打开问题文件所在文件夹的显示简介 将下面权限全部更改为读与写 一定要先解锁 然后点击应用到包含的项目  更改完成后记得把小锁锁上 这样就完成啦

  9. python 浏览器 弹 另存为_另存为弹出框如何调用

    1.这是系统自带的图片另存为 保存类型不能选择jpg,png等格式,如果这样的话用户就得手动在文件名后添加.jpg,用户体验很差 2.这是存在浏览器的设置问题,如果是设置,烦请告诉我怎么设置. 3.如 ...

最新文章

  1. Deep learning调参经验
  2. 零基础python从入门到精通 pdf-PYTHON从入门到精通 PDF 下载
  3. 不服来战!这才是产品汪与程序猿撕逼的正确方式
  4. 认识flex中的sprite
  5. Couchbase概述
  6. 190910-ajax-请求小结
  7. js之上传文件多图片预览
  8. python替换文件内容_使用python替换文件内容
  9. 位置采集[置顶] iPhone手机上的GPS位置信息采集与分享应用
  10. python创意实用案例-python实用案例
  11. 怎么通过安装包安装mysql_教你安装Mysql(解压版/非安装包)图文教程
  12. jq 克隆 移除table
  13. vue小案例---cnode
  14. android 获取软件签名工具,获取Android应用签名的几种方式
  15. java怎么播放视频_如何播放视频文件 java
  16. TwinCAT 3 file记录日志txt文件程序
  17. 鲁班学艺 ---学三个月的,手艺扎根在眼里;学三年的,手艺扎根在心里
  18. python 拆分excel单元格_python 操作excel
  19. Firewall常用
  20. linux内核5.8.1,Linus Torvalds宣布大规模更新Linux内核5.8

热门文章

  1. caffe常用层:特殊的Math函数
  2. mysql 异常码1903_Mysql 异常。 寻求帮助
  3. Elixir: Enum函数总结
  4. 先序和中序构造二叉树
  5. 一种化学荧光探针945928-17-6,TAMRA alkyne,5-isomer,四甲基罗丹明-炔基
  6. 1360: 最大公约与最小公倍
  7. uniapp获取云服务空间 数据
  8. 窗口特征(Window Features)
  9. Kali google 翻译
  10. 明日天津,择日来京--我回来了(九月二十日更新)