python下spy++句柄使用

来源:互联网 发布:扫描答题软件 编辑:程序博客网 时间:2024/06/05 03:43

抛出问题

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++得到的句柄直接操作。


原创粉丝点击