使用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")
使用位移方法本身不稳定,可先设置主窗口大小,尽量减少不确定因素。