Windows крюк с Python - PullRequest
       28

Windows крюк с Python

5 голосов
/ 17 февраля 2011

Привет, ребята.Я пытаюсь подключиться к окнам и использовать Python для записи нажатий клавиш.Для этого я использую процедуру обратного вызова LowLevelKeyboard.

def run():

    global KeyBdHook
    global messages

    KeyBdHook = HHook()
    messages = []

    start = time.time()

    #Record keystrokes for 2 seconds.
    while time.time() < (start + 2):
        KeyBdHook.hook = SetWindowsHookEx(13, KeyboardProc,
                                          GetModuleHandle(0), 0)
        if KeyBdHook.hook == 0:
            print 'ERROR: '+str(ctypes.windll.kernel32.GetLastError())
        UnhookWindowsHookEx(KeyBdHook.hook)

    print messages

def KeyboardProc(nCode, wParam, lParam):
    """http://msdn.microsoft.com/en-us/library/ms644985(v=vs.85).aspx"""


    if nCode < 0:
        return ctypes.windll.user32.GetNextHookEx(KeyBdHook.hook,
                                              nCode, wParam, lParam)
    else:
        ctypes.windll.kernel32.RtlMoveMemory(ctypes.addressof(KeyBdHook.kStruct),
                                             ctypes.c_void_p(lParam),
                                             ctypes.sizeof(lParam))

        messages.append(KeyBdHook.kStruct)
        return ctypes.windll.user32.GetNextHookEx(KeyBdHook.hook,
                                          nCode, wParam, lParam)


def SetWindowsHookEx(idHook, lpFn, hMod, dwThreadId):
    WinFunc = ctypes.WINFUNCTYPE(c_ulong, c_ulong, c_ulong, c_ulong)
    return ctypes.windll.user32.SetWindowsHookExA(idHook, WinFunc(lpFn), hMod, dwThreadId)

def GetModuleHandle(lpModuleName):
    return ctypes.windll.kernel32.GetModuleHandleA(lpModuleName)

def UnhookWindowsHookEx(hHook):
    return ctypes.windll.user32.UnhookWindowsHookEx(hHook)

class HHook():        
    def __init__(self):
        self.hook = HHOOK
        self.kStruct = KBLLHOOKSTRUCT()

class KBLLHOOKSTRUCT(Structure):
    """http://msdn.microsoft.com/en-us/library/ms644967(v=vs.85).aspx"""

    _fields_ = [("vkCode", c_ulong),
                ("scanCode", c_ulong),
                ("flags", c_ulong),
                ("time", c_ulong),
                ("dwExtraInfo", POINTER(c_ulong))]

Проблема в том, что она никогда не входит в функцию KeyboardProc.Я думаю, что мне, возможно, придется привести ее как функцию типа C, используя ctypes.WINFUNCTYPE или ctypes.CFUNCTYPE, но я не могу понять это.Похоже, что Windows не выдает ошибку на SetWindowsEx.

Я предполагаю, что он не обрабатывает параметр KeyboardProc, передаваемый в SetWindowsEx.Любые идеи о том, как привести это, чтобы Windows могла вводить данные в него?Спасибо.

1 Ответ

4 голосов
/ 19 апреля 2015

Чтобы возродить старый вопрос, убеждение ThiefMaster в том, что dll требуется, не является точным.В качестве контр-примера я поставил чистый модуль горячих клавиш Python, который реализует то, что запрашивает OP. Это репозиторий Github .

Кроме того, для дополнительных функций я рекомендую pyHook или pyhk. .

Кроме того, для получения дополнительных функций рассмотрите pywinauto , который включает в себя модуль горячих клавиш и многое другое.

...