2013-03-05 70 views
0

這是一個python鍵盤記錄器和窗口標題採集器的代碼,但我無法同時抓住它們。Python - 窗口標題和鍵盤記錄器

import pythoncom, pyHook ,time 

def OnKeyboardEvent(event): 
      keylog= chr(event.Ascii) 

      print keylog 
      key = event.WindowName 
      print key 
      time.sleep(0.1) 
      if(key==event.WindowName): 
       pass 
      else: 
       key = event.WindowName 
       print key 

hm = pyHook.HookManager() 
hm.KeyDown = OnKeyboardEvent 
hm.HookKeyboard() 
pythoncom.PumpMessages() 

輸出是像

一個開始菜單 b啓動菜單 c啓動菜單 d cmd.exe的

和我需要它像

開始菜單 ABC

cmd.exe d

回答

1

你的代碼沒有任何意義。我們來看看它的功能:

 keylog= chr(event.Ascii) 

     print keylog 

這會打印按下的按鍵。

 key = event.WindowName 
     print key 

這會打印窗口名稱。我不確定爲什麼你把它放在一個名爲key的變量中,當它不是一個關鍵字時,但它不會改變它的功能。

 time.sleep(0.1) 

這會暫停,大概是這樣,如果用戶打字速度太快,您可以確保錯過按鍵?

 if(key==event.WindowName): 
      pass 

這始終是真的,因爲你設置key = event.WindowName較早,而event對象不會動態更改。

 else: 
      key = event.WindowName 
      print key 

這從來沒有發生,如上所述。但是,如果確實如此,它會將key設置爲其已有值(窗口名稱)並再次打印。

我的猜測是,你在試圖這裏做的是隻打印窗口名稱,如果它不同於上次或類似的東西?快速&骯髒的方式做到這一點是一個全局變量:

lastWindow = None 

def OnKeyboardEvent(event): 
    global lastWindow 

    window = event.WindowName 
    key = chr(event.Ascii) 

    if window != lastWindow: 
     print window 
     lastWindow = window 

    print key 

所以,在你的測試用例,而不是這樣的:

a Start menu b Start menu c Start menu d cmd.exe 

你應該得到這樣的:

Start menu a b c cmd.exe d 

(雖然實際上,你將會把它們放在單獨的行中,而不是空格分隔,因爲你的代碼只是print keylogprint key,而且我也是這樣做的。希望他們全部在一行上,在每個print聲明的末尾加逗號。)

+0

您好, 感謝您的回覆。你的代碼再次幫助我瞭解了我所得到的。 '開始菜單 一個 b Ç D' 現在,它正在爲WINDOWTITLE重複的條目,但現在我的一些問題 1.正在爲每個字母新的生產線。 2.現在只有在按下按鍵時纔會抓取窗口標題名稱,而且我希望它在每1秒後抓取窗口標題名稱。 3.如果未按下按鍵,它不檢查窗口標題名稱。 希望你能幫助我。 謝謝 – user2137297 2013-03-20 15:24:06