pyHook перестает получать события нажатия клавиш (случайно)? - PullRequest
2 голосов
/ 19 марта 2012

У меня есть программа, которая фиксирует все нажатия клавиш с помощью 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)

Ответы [ 2 ]

2 голосов
/ 04 января 2013
0 голосов
/ 15 апреля 2013

Возможно, вы пытаетесь многое сделать, отказавшись от обратного вызова события.

Любой обратный вызов функции события, настроенный с помощью 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.

Вот довольно прямая ссылка на правильную обработку сообщений (именно это знает подсознательный менеджерполучить, и с помощью которого PumpMessages доставляет), http://msdn.microsoft.com/en-us/library/ms644927(v=vs.85).aspx

Если окно верхнего уровня перестает отвечать на сообщения в течение более нескольких секунд, система считает, что окно не отвечает.

и

Обработка сообщений AПриложение должно удалять и обрабатывать сообщения, отправленные в очереди сообщений своих потоков

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

...