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

python+pywin32处理另存为弹出框保存文件_第1张图片

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

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


python+pywin32处理另存为弹出框保存文件_第2张图片

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

# 获取另存为弹出框

calssname = u"#32770"

titlename = u"文件另存为"

hwnd = win32gui.FindWindow(calssname,titlename)

2.输入文件名

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

python+pywin32处理另存为弹出框保存文件_第3张图片

# 获取文件名输入框

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


python+pywin32处理另存为弹出框保存文件_第4张图片

# 点击保存按钮

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


python+pywin32处理另存为弹出框保存文件_第5张图片
未点击地址栏时路径的窗口句柄是上图这样的
python+pywin32处理另存为弹出框保存文件_第6张图片
点击地址栏之后路径窗口句柄变成下图这样

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.取消按钮的点击无效(已解决)

python+pywin32处理另存为弹出框保存文件_第7张图片
保存按钮
python+pywin32处理另存为弹出框保存文件_第8张图片
取消按钮

保存和取消的类名都是“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+pywin32处理另存为弹出框保存文件_第9张图片
python+pywin32处理另存为弹出框保存文件_第10张图片

你可能感兴趣的:(python+pywin32处理另存为弹出框保存文件)