2017-05-08 2 views
0

Je travaille actuellement avec une bibliothèque en Python qui enregistre toutes les entrées de l'utilisateur. Le code source peut être trouvé ici: https://github.com/JeffHoogland/pyxhook/blob/master/pyxhook.pyConfusion sur les classes Python dans le code source Pyxhook

J'ai regardé la source pendant un certain temps et ne peux pas comprendre comment cela fonctionne réellement. J'ai tracé la fonction processevents(self, reply) dans toute la source et je ne comprends pas d'où vient le vairble event. Les lignes exactes sont:

def processevents(self, reply): 
     if reply.category != record.FromServer: 
      return 
     if reply.client_swapped: 
      print("* received swapped protocol data, cowardly ignored") 
      return 
     try: 
      # Get int value, python2. 
      intval = ord(reply.data[0]) 
     except TypeError: 
      # Already bytes/ints, python3. 
      intval = reply.data[0] 
     if (not reply.data) or (intval < 2): 
      # not an event 
      return 
     data = reply.data 
     while len(data): 
      event, data = rq.EventField(None).parse_binary_value(
       data, 
       self.record_dpy.display, 
       None, 
       None 
      ) 
      if event.type == X.KeyPress: 
       hookevent = self.keypressevent(event) 
       self.KeyDown(hookevent) 
      elif event.type == X.KeyRelease: 
       hookevent = self.keyreleaseevent(event) 
       self.KeyUp(hookevent) 
      elif event.type == X.ButtonPress: 
       hookevent = self.buttonpressevent(event) 
       self.MouseAllButtonsDown(hookevent) 
      elif event.type == X.ButtonRelease: 
       hookevent = self.buttonreleaseevent(event) 
       self.MouseAllButtonsUp(hookevent) 
      elif event.type == X.MotionNotify: 
       # use mouse moves to record mouse position, since press and 
       # release events do not give mouse position info 
       # (event.root_x and event.root_y have bogus info). 
       hookevent = self.mousemoveevent(event) 
       self.MouseMovement(hookevent) 

     # print("processing events...", event.type) 
+1

La fonction rq.EventField (Aucun) de .parse_binary_value() est en retournant un objet événement qui a taper comme un attribut au sein it.It renvoie également data.So , pour chaque pression de touche ou bouton, un objet événement est créé – bigbounty

+0

Je ne suis pas familier avec cette fonction, d'où vient-elle? – Astrum

+0

Je risque de deviner que ces événements sont émis par le système d'exploitation, et n'ont rien à voir avec Python. Ils sont capturés et énumérés par l'interface Xlib [python] (https://github.com/python-xlib). –

Répondre

1

Dans le code que vous avez affiché, un objet événement est créé dynamiquement pour chaque pression de touche ou pression de bouton. Dans le système d'exploitation, lorsque vous cliquez sur un caractère du clavier, un événement est automatiquement déclenché qui indique que cette touche particulière a été enfoncée. event, data = rq.EventField(None).parse_binary_value( data, self.record_dpy.display, None, None ) Ici, dès que l'utilisateur a appuyé sur une touche, une requête est envoyée au serveur et l'événement est en outre envoyé pour traitement à cette fonction avec l'attribut d'événement en tant que type. Ainsi, en comparant le type de l'événement, qu'il s'agisse d'une pression sur une touche ou d'une pression sur un bouton, etc., le code effectue un traitement supplémentaire.

1

Voici le code source:

class EventField(ValueField): 
    structcode = None 

    def pack_value(self, value): 
     if not isinstance(value, Event): 
      raise BadDataError('%s is not an Event for field %s' % (value, self.name)) 

     return value._binary, None, None 

    def parse_binary_value(self, data, display, length, format): 
     from . import event 

     estruct = display.event_classes.get(byte2int(data) & 0x7f, event.AnyEvent) 
     if type(estruct) == dict: 
      # this etype refers to a set of sub-events with individual subcodes 
      estruct = estruct[indexbytes(data, 1)] 

     return estruct(display = display, binarydata = data[:32]), data[32:] 

parse_binary_value retourne deux valeurs, dont le premier est attribué à la variable event.

Vous pouvez voir le contexte plus large de ce code source here