Python win32gui 应用程序 - 试图从外部线程退出
Python win32gui application - trying to quit from external thread
我有一个 python 应用程序,它使用通过 win32 创建的托盘图标来控制 tkinter GUI。托盘图标可以向 tkinter GUI (hide/show/close/etc.) 发出命令,但由于它在单独的线程中,因此不会接受来自 tkinter GUI 的命令(例如退出程序)。
我在这里找到了一个回复,概述了访问托盘图标线程的过程:
- 从 GetWindowThreadProcessId() 获取托盘图标的线程 ID
- 使用 SetWindowsHookEx() 安装消息挂钩
- 使用消息钩子触发托盘图标线程的退出命令
这听起来很简单,但我不清楚如何在实践中实现它。
第 1 步很简单:
tid, pid = win32process.GetWindowThreadProcessId(self.hwnd)
有人可以提供有关步骤 2 和 3 的格式的 example/guidance 吗?
IInspectable 在评论中建议的解决方案是直接使用 PostMessage,如下所示:
win32gui.PostMessage(self.hwnd, win32con.WM_CLOSE, 0, 0)
这允许 tkinter GUI 告诉 win32 托盘图标退出,而不会遇到与线程相关的访问错误。
我有一个 python 应用程序,它使用通过 win32 创建的托盘图标来控制 tkinter GUI。托盘图标可以向 tkinter GUI (hide/show/close/etc.) 发出命令,但由于它在单独的线程中,因此不会接受来自 tkinter GUI 的命令(例如退出程序)。
我在这里找到了一个回复,概述了访问托盘图标线程的过程:
- 从 GetWindowThreadProcessId() 获取托盘图标的线程 ID
- 使用 SetWindowsHookEx() 安装消息挂钩
- 使用消息钩子触发托盘图标线程的退出命令
这听起来很简单,但我不清楚如何在实践中实现它。
第 1 步很简单:
tid, pid = win32process.GetWindowThreadProcessId(self.hwnd)
有人可以提供有关步骤 2 和 3 的格式的 example/guidance 吗?
IInspectable 在评论中建议的解决方案是直接使用 PostMessage,如下所示:
win32gui.PostMessage(self.hwnd, win32con.WM_CLOSE, 0, 0)
这允许 tkinter GUI 告诉 win32 托盘图标退出,而不会遇到与线程相关的访问错误。