我试图注册一个系统范围的热键,它会在我的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有时会崩溃。
答案 0 :(得分:1)
ord("v")
应该是ord("V")
。