Как прослушивать горячие клавиши в отдельном потоке, используя Python с Win32 API и PySide6?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как прослушивать горячие клавиши в отдельном потоке, используя Python с Win32 API и PySide6?

Сообщение Anonymous »

Я настраиваю систему горячих клавиш для Windows на Python, используя Win32 API и PySide6. Я хочу зарегистрировать горячие клавиши в классе HotkeyManager и прослушивать их в отдельном потоке, чтобы графический интерфейс оставался отзывчивым. Однако когда я перемещаю логику прослушивания в поток, события горячих клавиш не обнаруживаются правильно.
Вот код, который работает без использования потоков, где горячие клавиши регистрируются и обнаруживаются в основном потоке. :

Код: Выделить всё

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()

Однако, когда я пытаюсь переместить метод Listen() в отдельный поток, горячая клавиша не реагирует должным образом:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»