Вот код, который работает без использования потоков, где горячие клавиши регистрируются и обнаруживаются в основном потоке. :
Код: Выделить всё
from threading import Thread
from typing import Callable, Dict
from win32gui import RegisterHotKey, UnregisterHotKey, GetMessage
from win32con import VK_NUMPAD0, MOD_NOREPEAT
class HotkeyManager:
def __init__(self):
self.hotkey_id = 1
self._callbacks: Dict[int, Callable] = {}
def register_hotkey(self, key_code: int, callback: Callable):
self._callbacks[self.hotkey_id] = callback
RegisterHotKey(0, self.hotkey_id, MOD_NOREPEAT, key_code)
self.hotkey_id += 1
def listen(self):
while True:
print("Listener started.")
msg = GetMessage(None, 0, 0)
hotkey_id = msg[1]
if hotkey_id in self._callbacks:
self._callbacks[hotkey_id]()
Код: Выделить всё
from PySide6 import QtWidgets
from win32con import VK_NUMPAD0
def on_press():
print("Numpad 0 pressed!")
app = QtWidgets.QApplication([])
manager = HotkeyManager()
manager.register_hotkey(VK_NUMPAD0, on_press)
manager.listen()
# Initialize window
widget = QtWidgets.QMainWindow()
widget.show()
app.exec()
Код: Выделить всё
class HotkeyManager:
def listen(self):
def run():
while True:
print("Listener started.")
msg = GetMessage(None, 0, 0)
hotkey_id = msg[1]
if hotkey_id in self._callbacks:
self._callbacks[hotkey_id]()
thread = Thread(target=run, daemon=True)
thread.start()
Подробнее здесь: https://stackoverflow.com/questions/791 ... -api-and-p