抛出问题
1、spy++下得到的句柄如何使用?
2、没有标题的窗口如何使用FindWindowEx得到句柄
3、同类型的控件如何区分
4、层数过多如何快速得到对象
答:都可以直接使用句柄定位
在做一个自动化工具时候,发现很多窗口没有标题,因为findWindowEx第四个参数用标题定位很方便,也基本是唯一。于是不得不继续研究findWindowEx这个函数。
FindWindowEx(
Parent: HWND; {要查找子窗口的父窗口句柄}
Child: HWND; {子窗口句柄}
ClassName: PChar; {}
WindowName: PChar {}
)
前两个参数是10进制的数字,而spy++得到的是16进制,转换一下,填写十进制的数就可以。
以上的基本知识背景
下面我们具体介绍如何使用
假设我们有一个工具,用spy++得到了标题是自动化工具,我们可以使用以下函数得到窗口
win = win32gui.FindWindow(None,u'自动化工具')
print win就可以看到窗口句柄,和spy++得到的对比是一样的。
接下来,在自动化工具下面,有一个窗口是配置界面。
于是,我们使用
hhand = win32gui.FindWindowEx(win,None,None,u"配置界面")
就得到了配置界面窗口
但是,我们还可以使用
htet = win32gui.FindWindowEx(123456,None,None,u"配置界面")//123456就是用spy++得到的父窗口的句柄
这样就省去了得到父窗口这句函数
现在,有另一个问题,我们要操作一个按钮button,一般的方式是,先找父窗口,然后
bhand = win32gui.FindWindowEx(win,None,None,u"按钮")
left,top,right,bottom = win32gui.GetWindowRect(bhand)
win32api.SetCursorPos((left+(right-left)/2,top+(bottom-top)/2))//鼠标操作
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)//鼠标操作
...
现在我们发现button标题不存在,于是我们可以直接
left,top,right,bottom = win32gui.GetWindowRect(123456)//123456就是spy++得到的句柄,10进制
win32api.SetCursorPos((left+(right-left)/2,top+(bottom-top)/2))//鼠标操作
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)//鼠标操作
...这样也是可行的
后话
通过句柄直接定位有一个很大的问题就是移植麻烦,而且软件打开后句柄就会变,有标题通过标题定位是最好的,在某些极端情况下,可以使用spy++得到的句柄直接操作。