使用pywinauto.top_window()与线程一起使用时会挂起

时间:2017-07-30 14:43:22

标签: python multithreading com pywinauto comtypes

如果我创建一个线程,它所做的就是连接到某个进程并获得它的顶层窗口,那么程序就会挂起。

我调试了一下它似乎陷入 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中输入步骤后,会显示此信息然后冻结:

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

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

这里可以做些什么?

感谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,

pywinauto==0.6.4对COM对象使用多线程模式(MTA)。只需将其pip install -U pywinauto升级,然后检查它是否适合您。