什么?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函数中,怎么获取第二个参数的值?

Python下Pywin32的使用教程

win32gui.FindWindow 找不到窗口

请教一个利用pywin32向特定窗口发送键盘消息的问题

如何将键盘事件发送到 Pywin32 中的不同窗口?

如何在 C++ 代码中使用 pywin32 函数?