В Windows, как я могу установить глобальный хук клавиатуры самого низкого уровня, возможный? - PullRequest
6 голосов
/ 14 июня 2011

Я работаю над пользовательским аркадным пусковым механизмом в python для Windows.Я хочу выбрать систему и игру, затем запустить эмулятор - и требовать определенную комбинацию клавиш, чтобы убить эмулятор.Все мои перехватчики ключей работают при тестировании со случайными приложениями, но когда я на самом деле запускаю эмуляторы (например, Nestopia), мои перехватчики ключей не запускаются.В настоящее время я использую RegisterHotKey, который получает события, но не горячие клавиши.У кого-нибудь есть идеи, как установить что-то достаточно низкое, чтобы на самом деле получить событие до Nestopia?Вот мой код:

import ctypes
import win32con
from ctypes import wintypes
from ctypes import byref
user32 = ctypes.windll.user32

class SimpleKeyboardHook:

  def getNextId(self):
    SimpleKeyboardHook._id += 1
    return SimpleKeyboardHook._id

  # modifiers is a bitmask with win32con.[MOD_SHIFT, MOD_ALT, MOD_CONTROL, MOD_WIN]
  def waitFor(self, key, modifiers):

    # coerce to 0 if necessary
    modifiers = modifiers or 0

    id = self.getNextId()
    hk = user32.RegisterHotKey(None, id, modifiers, key)
    print "register hotkey: ",hk
    if not hk:
      print "Unable to register hotkey for key ", key
      return False

    print "registered id", id

    try:
      msg = wintypes.MSG()
      while user32.GetMessageA(byref(msg), None, 0, 0) != 0:
        print "got message",msg.message,"which is not",win32con.WM_HOTKEY
        if msg.message == win32con.WM_HOTKEY:
          print "got hotkey"
          if msg.wParam == id:
            print "found proper hotkey"
            return True

        user32.TranslateMessage(byref(msg))
        user32.DispatchMessageA(byref(msg))
    finally:
      user32.UnregisterHotKey(None, id)

    return False

SimpleKeyboardHook._id = 0

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Вы обязательно должны взглянуть на SetWindowsHookEx от user32. Эти функции позволяют регистрировать глобальные клавиатурные хуки. (Только не забудьте передать их, вызвав CallNextHookEx.)

Ссылка: http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

Я понятия не имею, как это сделать из python, извините.

0 голосов
/ 14 июня 2011

Вы уже пытались использовать pyHook в SourceForge? Вы можете проверить DaniWeb для примера использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...