什么?pywin32下的FindWindow函数竟然还不支持文本模糊查找?
Posted NewJune
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么?pywin32下的FindWindow函数竟然还不支持文本模糊查找?相关的知识,希望对你有一定的参考价值。
我们通过python来开发自动化或者RPA工具时,经常需要用到大名鼎鼎的pywin32库。里面有诸如sendMessage、PostMessage、FindWindow、FindwindowEx、EnumWindows等大票好用的windows系统API函数。提到Findow函数,就不得不提及它的一大缺憾:不支持基于窗口标题关键字模糊查找。
我们先来认识下今天的主角FindWindow函数。
MSDN中的解释如下:
简单地说,该函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串,并不会搜索子窗口。
它的C++参数构成如下:
HWND FindWindowA( [in, optional] LPCSTR lpClassName, [in, optional] LPCSTR lpWindowName );
再来看下它的返回值:
如果函数执行成功,它会返回包含指定类名和窗口名的窗口对应的句柄,如果失败,则返回Null。
认识了该函数之后,我们再回到文章开头提到的痛点,如何让该函数支持基于窗口标题模糊查找呢?
大体的思路是,利用EnumWindows函数得到所有顶级窗口的句柄,再通过GetClassName、GetWindowText等函数依次拿到对应窗口的类名、标题,并与我们预设的类名、窗口名关键字进行匹配,如果能关联到,返回对应的窗口句柄即可,我们需要的是这样一个人性化的FindWindow函数,姑且取名find_window_wildcard,说干就干,下面是具体的实现过程。
import win32gui,re class WindowMgr: """Encapsulates some calls to the winapi for window management""" def __init__ (self): """Constructor""" self._handle = None def find_window(self, class_name, window_name=None): """基于类名来查找窗口""" self._handle = win32gui.FindWindow(class_name, window_name) def _window_enum_callback(self, hwnd, class_name_wildcard_list): """传递给win32gui.EnumWindows(),检查所有打开的顶级窗口""" class_name,wildcard=class_name_wildcard_list if win32gui.GetClassName(hwnd)==class_name and re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None: self._handle = hwnd def find_window_wildcard(self, class_name,wildcard): """根据类名,查找一个顶级窗口,确保其类名相符,且标题可以用正则表达式匹配对应的通配符""" self._handle = None win32gui.EnumWindows(self._window_enum_callback,[class_name, wildcard]) return self._handle def set_foreground(self): """put the window in the foreground""" win32gui.SetForegroundWindow(self._handle) def get_hwnd(self): """return hwnd for further use""" return self._handle if __name__=="__main__": myWindowMgr=WindowMgr() \'\'\'查找一个类名为XLMAIN,窗口标题中含【银行余额】字符串的窗口,并返回它的句柄;如果没找到,返回None\'\'\' excelHwnd=myWindowMgr.find_window_wildcard("XLMAIN",".*?银行余额.*?") print(excelHwnd)
各位筒子赶紧试试,试完你一定会回来感谢我的,相信我~~
快来扫码关注我的公众号 获取更多爬虫、数据分析的知识!
以上是关于什么?pywin32下的FindWindow函数竟然还不支持文本模糊查找?的主要内容,如果未能解决你的问题,请参考以下文章
python pywin32 里面操作窗体,获取窗体里面的数据,在函数GetDlgItem函数中,怎么获取第二个参数的值?