使用系统范围的热键将焦点更改为Tkinter程序

时间:2014-05-07 19:48:51

标签: python python-3.x ctypes pywin32

我试图注册一个系统范围的热键,它会在我的Tkinter程序中触发一些动作。我使用this作为参考。当我从该链接运行代码时,它工作正常。我所挣扎的是将循环与Tkinter中的事件循环集成。

Tkinter循环需要定期检查被按下的热键。这应该是微不足道的,使用root.after()。但是,程序似乎根本没有按下热键,即使它处于焦点时也是如此。

这是一个简洁的代码示例 - 它只是我能得到它的简短。它代表了我尝试修改链接中的代码以便与Tkinter很好地协作。

from tkinter import *
import ctypes
from ctypes import wintypes
import win32con

user32 = ctypes.windll.user32
byref = ctypes.byref

def hotkey_handler(root):
    msg = wintypes.MSG()
    if user32.GetMessageA(byref(msg), None, 0, 0) != 0:
        if msg.message == win32con.WM_HOTKEY:
            if msg.wParam == 1:
                print("hotkey pressed")
    user32.TranslateMessage(byref(msg))
    user32.DispatchMessageA(byref(msg))
    root.after(1, hotkey_handler, root)

root = Tk()

if user32.RegisterHotKey(None, 1, win32con.MOD_SHIFT, ord("v")) != 0:
    print("--Hotkey registered!")

root.after(1, hotkey_handler, root)

root.mainloop()

我注意到的一个怪癖是,如果我将root.after()的第一个参数设置为零,则GUI无法正确绘制,Python有时会崩溃。

1 个答案:

答案 0 :(得分:1)

eryksun指出了问题 - 我使用了错误的情况用于热键。 ord("v")应该是ord("V")