2012-03-18 24 views
2

我有一個程序可以捕獲所有使用pyHook的按鍵,然後運行一些函數。
我注意到,經過一段時間(隨機時間)後,程序停止接收鍵觸發,即使我按鍵?
pyHook是否不穩定?
我沒有改變什麼鍵被按下或過早按下或類似的東西。
這裏是我的代碼:pyHook停止接收按鍵事件(隨機)?

import time 
import win32api 
import win32con 
import pythoncom 
import pyHook 
import os 
import ctypes 

def Click(x,y): 
    win32api.SetCursorPos((x,y)) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) 

def DeleteRun(event): 
    if event.Ascii == 96: 
     BreakHook() 
     return False 
    Click(1250, 741) 
    time.sleep(0.2) 
    Click(649,261) 
    time.sleep(0.2) 
    Click(651, 348) 
    time.sleep(0.2) 
    Click(800, 442) 
    time.sleep(0.2) 
    Click(865, 612) 
    time.sleep(0.2) 
    Click(25, 744) 
    time.sleep(3) 
    Click(25, 744) 
    time.sleep(1.5) 
    Click(1112,297) 
    Click(145,392) 
    return True 

def BreakHook(): 
    ctypes.windll.user32.PostQuitMessage(0) 

KeyGrabber = pyHook.HookManager() 
KeyGrabber.KeyDown = DeleteRun 
KeyGrabber.HookKeyboard() 
pythoncom.PumpMessages() 

爲什麼突然停止工作?
即使我通過IDE停止該程序,因爲該進程在我的計算機上保持活動狀態,這非常令人沮喪。

規格:
蟒蛇2.7.2
的Windows 7(32)

回答

0

您可能嘗試做很多事情回調。

通過HookManager和PumpMessages配置的任何事件函數回調應儘快返回。

當您按下某個鍵時,Windows足以通知您該事件,但可能有其他程序也需要該事件。你正在你的事件中進行睡眠呼叫,但是當你睡覺的時候,Windows正在等待你對這個回調的迴應。

我的猜測是,在一定數量的機會及時返回後,你的事件註冊是失效而被Windows忽略。

將您的睡眠命令移到事件外,而是在hookmanager回調之外觸發您實際的點擊睡眠序列。

編輯:鏈接/參考:

的PyHook API文檔是最好的(不幸)之一,http://pyhook.sourceforge.net/doc_1.5.0/如果您發現很多事情可以從事件中做,它變得很清楚,爲什麼時間是本質。 Windows想知道如何處理按鍵(例如),並且按鍵發生得非常快,所以它希望儘快知道。

重要的是要明白,PyHook是一個非常薄的層,並且大部分功能都是由Windows提供的,所以最好的文檔來自MSDN http://msdn.microsoft.com/en-us/library/ms632589(v=vs.85).aspx。也可能想要查看關於'消息'的一些信息(這是我們的PumpMessages最終導出的信息)的水平書面文本是非常具有描述性的,許多常量和值通過PyHook正確反映,儘管好代碼段不是用Python編寫的。

這是一個非常直接的參考信息的正確處理(這是什麼hookmanager知道如何獲得,並通過PumpMessages提供),http://msdn.microsoft.com/en-us/library/ms644927(v=vs.85).aspx

如果頂層窗口停止響應消息超過幾秒鐘,系統認爲該窗口沒有響應。

消息處理投遞到它的線程

的消息隊列 的應用程序必須刪除和處理消息當你打電話給你睡,你是掛在你的當前消息,並忽略可能堆疊的其他人。即使你抓住這條消息並立即返回,只要你消費,Windows並不關心你用它做了什麼。

+0

你能鏈接我的任何文件/信息解釋這一點? – 2013-04-15 01:34:12

+0

你必須知道PyHook可以做什麼,但很多事情沒有很好解釋或描述不佳。如果您花一點時間閱讀MSDN文檔,那麼可以在那裏找到許多不明原因的東西。特別是一些常數和枚舉值。也可以在ctypes.windll.user32 MSDN文檔中進行挖掘,您會發現更多... – user2097818 2013-04-15 22:23:44