python - pyHook stopper at modtage Key Press-hændelser (tilfældigt)?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et program, der fanger alle nøglepresser ved hjælp af pyHook, og kører derefter nogle få funktioner.

Jeg bemærker, at programmet efter et stykke tid (med tilfældig varighed) stoppede med at modtage nøgleudløsere, selvom jeg trykker på nøgler?

Er pyHook ustabil?

Jeg ændrer ikke, hvilke nøgler der trykkes eller trykker på dem for tidligt eller noget lignende.

Her er min kode:


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()


Hvorfor stopper pludselig arbejdet?

Det er meget frustrerende, da processen forbliver aktiv på min computer, selvom jeg stopper programmet gennem IDE.


Specifikationer:

python 2.7.2

Windows 7 (32)

Bedste reference


Lignende (tør jeg sige identiske?) Problemer blev diskuteret og løst her: pyHook + pythoncom stopper med at arbejde efter for mange nøgler trykket [[Python]]
og her: Pyhook stopper med at opfange vigtige begivenheder efter 6 presser

Andre referencer 1


Du må muligvis forsøge at gøre for meget fra at møde event-tilbagekaldelsen.


Enhver eventfunktion tilbagekaldelse som konfigureret via HookManager og PumpMessages skal returnere hurtigst muligt.


Når du trykker på en tast, er Windows så venlig at informere dig om arrangementet, men der kan være andre programmer, der også har brug for arrangementet. Du laver søvnopkald inden for dit arrangement, men mens du sover, venter Windows på dit svar på DENNE tilbagekald.


Mit gæt er, at efter et vist antal muligheder for at vende tilbage i tide, bliver din begivenhedsregistrering voided og ignoreret af Windows.


Flyt dine søvnkommandoer uden for begivenheden, og udløs i stedet din faktiske kliksøvnssekvens uden for hookmanager-tilbagekaldelsen.


Rediger: Links/Reference:


PyHook API-dokumentationen er en af ​​de bedste (desværre), http://pyhook.sourceforge.net/doc\_1.5.0/Hvis du bemærker de mange ting, du kan gøre inden for arrangementet, bliver det klart, hvorfor tiden er afgørende . Windows ønsker at vide, hvordan man håndterer tastaturet (for eksempel), og tastetryk sker meget hurtigt, så det vil gerne vide ASAP. [4]


Det er vigtigt at forstå, at PyHook er et meget tyndt lag, og det meste af funktionaliteten leveres af Windows, så de bedste dokumenter er fra MSDN http://msdn.microsoft.com/en-us/library/ms632589(v=vs .85) Aspx. Måske vil du også se et niveau på nogle af oplysningerne om 'Beskeder' (det er her vores PumpMessages i sidste ende henter) Den skrevne tekst er meget beskrivende, og mange af konstanterne og værdierne afspejles ordentligt gennem PyHook, selvom den gode Kodesegmenter er ikke skrevet i Python. [5]


Her er en ret direkte henvisning til korrekt håndtering af meddelelser (hvilket er hvad hookmanager ved, hvordan man får, og ved hvilken PumpMessages leverer), http://msdn.microsoft.com/en-us/library/ms644927(v=vs. 85) Aspx [6]



  Hvis et vindu på øverste niveau holder op med at svare på meddelelser i mere end flere sekunder, anser systemet, at vinduet ikke reagerer.



og



   Beskedhåndtering
  En ansøgning skal fjerne og behandle meddelelser, der er indsendt til meddelelseskøerne i dets tråde



Når du ringer til din sengeplads, hænger du i din nuværende besked og forsømmer de andre, der kan blive stablet op. Selvom du tager fat i beskeden og straks vender tilbage, er det ikke Windows, der bekymrer sig om hvad du gør med det, så længe du bruger.