2011-02-16 57 views
5

嘿傢伙。我試圖讓一個鉤子進入窗口並使用Python記錄擊鍵。爲此,我使用LowLevelKeyboard回調過程。Python與Python的鉤子

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函數。我想我可能必須使用ctypes.WINFUNCTYPE或ctypes.CFUNCTYPE將它作爲C型函數進行轉換,但我無法弄清楚。 Windows似乎並沒有在SetWindowsEx上拋出一個錯誤。

我假設它沒有處理傳遞給SetWindowsEx的KeyboardProc參數。有關如何將這種方式轉換爲Windows的任何想法都可以將數據輸入到它中?謝謝。

回答

3

爲了重新提出一個老問題,ThiefMaster認爲需要DLL是不準確的。作爲一個反例,我建立了一個純粹的Python熱鍵模塊,實現OP要求的內容。 This is the Github repo

此外,對於更多功能,我建議pyHookpyhk.

此外,有關更多功能,請考慮pywinauto,其中包含熱鍵模塊等等。

+0

這真的很棒。我認爲有必要提一下,它可以在沒有DLL的情況下通過實現消息循環來工作。 – 79E09796 2017-05-12 11:38:13