使用win32定位Windows 應用程序時,需要自動保存報告,win32gui.FindWindowEx()無法定位到名稱輸入框。
注:使用python語言
問題描述如下:
代碼:
save_w_hld=win32gui.FindWindow(u'#32770',u"另存為") win32gui.SetForegroundWindow(save_w_hld) save_name_edit=win32gui.FindWindowEx(save_w_hld,None,u'Edit',None) print save_name_edit
結果:
為0,即沒有找到classname為'Edit'的句柄
分析:
【另存為】窗口屬於Windows自帶窗口,我嘗試了其他種方法。
如:1. GetDlgItem通過ID獲取輸入框句柄,此窗口ID為1001的句柄不唯一。行不通
2. 由於點擊另存為之后,光標默認是在命名輸入框的,此時如果直接使用SendMessage寫入新的名稱abc,句柄填save_w_hld,發現文件命名沒有改,而是'另存為'彈框變成了'abc'。也行不通
問題解決方案:
通過主窗口坐標,按照位移將鼠標移動到命名框,使用GetCursorPos獲取點位,再通過WindowFromPoint得到鼠標所點的句柄。
hld=win32gui.FindWindow(u'#32770',u"另存為")
win32gui.SetForegroundWindow(hld)
#為保證每次打開時目標框所在屏幕坐標不變,在這里將另存為窗口坐標和大小寫死。此時文件名輸入框坐標就固定為(200,355)
win32gui.MoveWindow(hld,0,0,798,537,False)
edit=win32gui.WindowFromPoint((200,355))
win32api.SendMessage(edit,win32con.WM_SETTEXT,None,"abc")
使用位移方法本身不穩定,可先設置主窗口大小,盡量減少不確定因素。