在线程中使用 pywinauto.top_window() 时挂起

Using pywinauto.top_window() hangs when using it with threads

如果我创建一个线程,它所做的只是连接到某个进程并获取其顶部 window,那么程序会挂起。

稍微调试了一下,好像卡在了comtypes._compointer_base.from_params。这是整个回溯:

...
-> self.top_win = self.app.top_window()
  c:\python27\lib\site-packages\pywinauto\application.py(1095)top_window()
-> backend=self.backend.name)
  c:\python27\lib\site-packages\pywinauto\findwindows.py(197)find_elements()
-> cache_enable=True)
  c:\python27\lib\site-packages\pywinauto\uia_element_info.py(272)children()
-> return self._get_elements(IUIA().tree_scope["children"], cond, cache_enable)
  c:\python27\lib\site-packages\pywinauto\uia_element_info.py(261)_get_elements()
-> ptrs_array = self._element.FindAll(tree_scope, cond)
> c:\python27\lib\site-packages\comtypes\__init__.py(970)from_param()
-> return value

在 pdb 中输入 step 后,它显示如下然后冻结:

(Pdb) s
--Return--
> c:\python27\lib\site-packages\comtypes\__init__.py(970)from_param()-><POINTER... 41308a0>
-> return value

似乎问题出在线程中使用 comtypes,我尝试在调用线程(以及主线程)中调用 pythoncom.CoInitialize() 但它没有帮助。

这里可以做什么?

谢谢。

pywinauto==0.6.4 默认情况下对 COM 对象使用多线程模式 (MTA)。只需 pip install -U pywinauto 升级它并检查它是否适合您。