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輸入一個字符串薛耻,我根據(jù)系統(tǒng)需要生成的隨機數(shù),漢字的話需要轉碼,如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
先找到到上圖路徑欄句柄(查找成功)馒过,然后按回車,使地址欄變成可輸入狀態(tài)
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酗钞,就是沒查找到路徑編輯框腹忽,沒有找到原因来累,代碼運行下來路徑那里只是能看到的效果點擊了一下,但是不會變成輸入框狀態(tài)留凭,但是把鼠標移上去會變成輸入的狀態(tài)
然后win32gui.SendMessage(hwnd_filepath, win32con.WM_SETTEXT, None, 'C:\Users\Administrator\Desktop')這樣地址就輸入不進去佃扼,原因不明
視圖數(shù)操作的方法沒有找到
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')
以下兩行代碼點擊取消按鈕的時候兼耀,彈出框不關閉,然后發(fā)現(xiàn)點擊的是保存按鈕求冷,原因不明
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