python+pywin32處理另存為彈出框保存文件

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)

這樣是可輸入的狀態(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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末褪迟,一起剝皮案震驚了整個濱河市冗恨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌味赃,老刑警劉巖掀抹,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異心俗,居然都是意外死亡渴丸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門另凌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戒幔,你說我怎么就攤上這事吠谢。” “怎么了诗茎?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵工坊,是天一觀的道長献汗。 經常有香客問我,道長王污,這世上最難降的妖魔是什么罢吃? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮昭齐,結果婚禮上尿招,老公的妹妹穿的比我還像新娘。我一直安慰自己阱驾,他們只是感情好就谜,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著里覆,像睡著了一般丧荐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喧枷,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天虹统,我揣著相機與錄音,去河邊找鬼隧甚。 笑死车荔,一個胖子當著我的面吹牛,可吹牛的內容都是我干的呻逆。 我是一名探鬼主播夸赫,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咖城!你這毒婦竟也來了茬腿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤宜雀,失蹤者是張志新(化名)和其女友劉穎切平,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辐董,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡悴品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了简烘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苔严。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孤澎,靈堂內的尸體忽然破棺而出届氢,到底是詐尸還是另有隱情,我是刑警寧澤覆旭,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布退子,位于F島的核電站岖妄,受9級特大地震影響,放射性物質發(fā)生泄漏寂祥。R本人自食惡果不足惜荐虐,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丸凭。 院中可真熱鬧福扬,春花似錦、人聲如沸贮乳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽向拆。三九已至亚茬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浓恳,已是汗流浹背刹缝。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颈将,地道東北人梢夯。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像晴圾,于是被迫代替她去往敵國和親颂砸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353