在Python中消费COM事件

7 投票
1 回答
5331 浏览
提问于 2025-04-15 13:27

我正在尝试用Python做一个示例应用程序,这个程序需要使用一些COM对象。我读过《Python编程(Win32)》中著名的第12章,但关于这个问题,它只提到:

所有的事件处理都是通过普通的 IConnectionPoint 接口来完成的,虽然这超出了本书的范围,但标准的Python COM框架对此是完全支持的。

有没有人能帮我解释一下这个内容?我需要一个简单的入门示例。比如说,给这个示例添加代码,以捕捉电子表格的OnActivate事件。

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
...

1 个回答

6

我没有自动化过Excel,但我用了一些来自微软的语音API的代码,这些代码可能和你要的差不多,可以帮你入门:

ListenerBase = win32com.client.getevents("SAPI.SpInProcRecoContext")
class Listener(ListenerBase):
    def OnRecognition(self, _1, _2, _3, Result):
        """Callback whenever something is recognized."""
        # Work with Result

    def OnHypothesis(self, _1, _2, Result):
        """Callback whenever we have a potential match."""
        # Work with Result

然后在主循环中:

    while not self.shutting_down.is_set():
        # Trigger the event handlers if we have anything.
        pythoncom.PumpWaitingMessages() 
        time.sleep(0.1) # Don't use up all our CPU checking constantly

关于主循环的更多细节:

当发生某些事情时,回调函数不会立刻被调用;相反,你需要调用PumpWaitingMessages(),这个函数会检查是否有事件在等待,然后再调用合适的回调函数。

如果你想在这个过程中做其他事情,你需要在一个单独的线程中运行这个循环(可以看看线程模块);否则,它可能就会一直停在你的脚本底部。在我的例子中,我是在一个单独的线程中运行它,因为我还在运行一个图形用户界面(GUI);shutting_down变量是一个线程事件,你可以用它来告诉循环线程停止。

撰写回答