Windows上的全球热键与tkinter

时间:2013-12-26 15:05:44

标签: python tkinter pywin32

我想要一个python tkinter应用程序来注册一个全局热键(即使应用程序没有焦点也会触发)。我发现了一些碎片,但我找不到把它们放在一起的方法......

基本上,我可以注册热键(通过调用windows API RegisterHotKey),但它会向Tkinter主循环管理下的根窗口发送“WM_HOTKEY”消息,我无法找到绑定它的方法...

tk.protocol()函数似乎就在那里,但是这条消息似乎无法理解(我找不到已识别消息的完整列表)...

这是一个非工作代码示例,我想在按下“WIN-F3”时打印一条消息...

import Tkinter
import ctypes
import win32con

class App(Tkinter.Tk): 
    def __init__(self):
        Tkinter.Tk.__init__(self)

        user32 = ctypes.windll.user32
        if user32.RegisterHotKey (None, 1, win32con.MOD_WIN , win32con.VK_F3):
            print("hotkey registered")
        else:
            print("Cannot register hotkey")

        self.protocol("WM_HOTKEY", self.hotkey_received)

    def hotkey_received(self):
        print("hotkey")

if __name__ == "__main__":
    app = App()
    app.mainloop()
    try:
        app.destroy()
    except:
        pass    

由于

编辑--------------------------------

好的,我找到了一种方法,将整个窗口循环推送到一个独立的线程中,独立于tkinter主循环。

虽然因为我实际上有2个循环运行基本上与操作系统的相同类型的交互,但它需要一个消息队列来与应用程序进行交互,但它确实不是一个干净的解决方案。 。 如果有人有更好的选择,我会很高兴看到它......

1 个答案:

答案 0 :(得分:1)

有点晚了但也许对某人有帮助......阅读this answer