Differenze tra le versioni di "Intercettare i dati del mouse dai file-device mouse, mice, event"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "E' possibile intercettare i dati del mouse <SPAN style="text-decoration:underline">dai ''file-device''</span>: * /dev/input/mouse(n) * /dev/input/mice * /dev/input/event(n) la...")
 
Riga 43: Riga 43:
 
   Read #pr, s, -256
 
   Read #pr, s, -256
 
   
 
   
 +
<FONT color=gray>' ''Per poter successivamente scomporre i vari dati dall'unica stringa, creiamo da quella stringa un puntatore:''</font>
 
   p = Alloc(s)
 
   p = Alloc(s)
 +
<FONT color=gray>' ''Quindi dereferenziamo il Puntatore con un'apposite funzione di dereferenziazione che restituisce un tipo "Intero", e ne andiamo a leggere il valore:''</font>
 
   i = Int@(p)
 
   i = Int@(p)
 
      
 
      
   Select Case i  <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
   Select Case i  <FONT color=gray>'</font> <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
 
   
 
   
 
     Case 16711720                  <FONT color=gray>' ''spostamento in basso''</font>
 
     Case 16711720                  <FONT color=gray>' ''spostamento in basso''</font>
Riga 92: Riga 94:
 
  <FONT color=gray>' ''...quindi apriamo il file per la lettura ed per essere "osservato":''</font>
 
  <FONT color=gray>' ''...quindi apriamo il file per la lettura ed per essere "osservato":''</font>
 
   fl = Open "/dev/input/mouse0" For Read Watch
 
   fl = Open "/dev/input/mouse0" For Read Watch
 
 
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 99: Riga 100:
 
  '''Public''' Sub File_Read()
 
  '''Public''' Sub File_Read()
 
    
 
    
  Dim s As String
+
  Dim s As String
  Dim p As Pointer
+
  Dim p As Pointer
  Dim i As Integer
+
  Dim i As Integer
 
 
 
    
 
    
 
  <FONT color=gray>' ''Leggiamo i dati dal file-device del mouse...''</font>
 
  <FONT color=gray>' ''Leggiamo i dati dal file-device del mouse...''</font>
Riga 110: Riga 110:
 
   i = Int@(p)
 
   i = Int@(p)
 
      
 
      
   Select Case i  <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
   Select Case i  <FONT color=gray>'</font> <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
 
   
 
   
 
     Case 16711720                  <FONT color=gray>' ''spostamento in basso''</font>
 
     Case 16711720                  <FONT color=gray>' ''spostamento in basso''</font>
Riga 159: Riga 159:
 
  '''Public''' Sub tp_Read()
 
  '''Public''' Sub tp_Read()
 
   
 
   
  Dim s As String
+
  Dim s As String
  Dim p As Pointer
+
  Dim p As Pointer
  Dim i As Integer
+
  Dim i As Integer
  Dim j As Byte
+
  Dim j As Byte
  Dim dw As DesktopWindow
+
  Dim dw As DesktopWindow
 
 
    
 
    
 
  <FONT color=gray>' ''leggiamo i dati dal file-device del mouse...''</font>
 
  <FONT color=gray>' ''leggiamo i dati dal file-device del mouse...''</font>
    Read #tp, s, -256
+
  Read #tp, s, -256
 
   
 
   
    p = Alloc(s)
+
  p = Alloc(s)
    i = Int@(p)
+
  i = Int@(p)
 
    
 
    
  <FONT color=gray>' ''Al rilascio di un qualunque tasto conosceremo le coordinate assolute del puntatore del mouse
+
  <FONT color=gray>' ''Al rilascio di un qualunque tasto conosceremo le coordinate assolute del puntatore del mouse in quel momento sullo schermo (anche se si è cliccato al di fuori di una finestra):''</font>
' ''in quel momento sullo schermo (anche se si è cliccato al di fuori di una finestra):''</font>
+
  If i = 8 Then
      If i = 8 Then
+
    TextArea1.Text = "tasto Rilasciato\n" & "\nScreenX = " & Mouse.ScreenX & "\nScreenY = " & Mouse.ScreenY
        TextArea1.Text = "tasto Rilasciato\n" & "\nScreenX = " & Mouse.ScreenX & "\nScreenY = " & Mouse.ScreenY
+
  Endif
      Endif
+
 
 +
  For j = 1 To Desktop.Windows.Count - 1
 
   
 
   
      For j = 1 To Desktop.Windows.Count - 1
+
    dw = New DesktopWindow(Desktop.Windows[j].Id)
+
   
        dw = New DesktopWindow(Desktop.Windows[j].Id)
+
  <FONT color=gray>' ''Se la finestra cliccata è uguale al nome dell'applicazione, allora si salta al giro successivo, evitando così di chiudere l'applicazione principale:''</font>
+
    If Desktop.Windows[j].VisibleName = Application.Name Then Continue
  <FONT color=gray>' ''Se la finestra cliccata è uguale al nome dell'applicazione,''
 
' ''allora si salta al giro successivo, evitando così di chiudere l'applicazione principale:''</font>
 
        If Desktop.Windows[j].VisibleName = Application.Name Then Continue
 
 
   
 
   
 
  <FONT color=gray>' ''Se l'Id della finestra attiva è uguale all'Id della finestra cliccata...''</font>
 
  <FONT color=gray>' ''Se l'Id della finestra attiva è uguale all'Id della finestra cliccata...''</font>
        If Desktop.ActiveWindow = Desktop.Windows[j].Id Then
+
    If Desktop.ActiveWindow = Desktop.Windows[j].Id Then
 
   
 
   
 
  <FONT color=gray>' ''...allora verifica quale tasto del mouse è stato premuto:''</font>
 
  <FONT color=gray>' ''...allora verifica quale tasto del mouse è stato premuto:''</font>
          Select Case i
+
      Select Case i
            Case 9        <FONT color=gray>' ''tasto Sinistro''
+
        Case 9        <FONT color=gray>' ''tasto Sinistro''
 
  ' ''Vengono mostrate nella "TextArea" alcune proprietà della finestra cliccata:''</font>
 
  ' ''Vengono mostrate nella "TextArea" alcune proprietà della finestra cliccata:''</font>
              With dw
+
          With dw
                TextArea1.Text = .VisibleName & "\n"
+
            TextArea1.Text = .VisibleName & "\n"
                TextArea1.Text &= .Id & "\n"
+
            TextArea1.Text &= .Id & "\n"
                TextArea1.Text &= .X & "\n"
+
            TextArea1.Text &= .X & "\n"
                TextArea1.Text &= .Y & "\n"
+
            TextArea1.Text &= .Y & "\n"
                TextArea1.Text &= .W & "\n"
+
            TextArea1.Text &= .W & "\n"
                TextArea1.Text &= .H & "\n"
+
            TextArea1.Text &= .H & "\n"
              End With
+
          End With
            Case 10        <FONT color=gray>' ''tasto Destro''''</font>
+
        Case 10        <FONT color=gray>' ''tasto Destro''''</font>
 
  <FONT color=gray>' ''Se si clica con il tasto destro del mouse, la finestra viene spostata in altre coordinate dello schermo:''</font>
 
  <FONT color=gray>' ''Se si clica con il tasto destro del mouse, la finestra viene spostata in altre coordinate dello schermo:''</font>
              dw.Move(500, 300)
+
          dw.Move(500, 300)
            Case 12        <FONT color=gray>' ''tasto Centrale''
+
        Case 12        <FONT color=gray>' ''tasto Centrale''
  ' ''Se, invece, si clicca sulla finestra con il tasto centrale del mouse,''
+
  ' ''Se, invece, si clicca sulla finestra con il tasto centrale del mouse, allora la finestra viene chiusa:''</font>
' ''allora la finestra viene chiusa:''</font>
+
          dw.Close
              dw.Close
+
      End Select   
          End Select   
 
 
   
 
   
        Endif
+
    Endif
 
   
 
   
      Next
+
  Next
 
    
 
    
 
   Free(p)
 
   Free(p)
Riga 231: Riga 227:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
   
 
   
  Dim s As String
+
  Dim s As String
 
   
 
   
 
  <FONT color=gray>' ''Individuiamo esattamente il file-device del mouse:''</font>
 
  <FONT color=gray>' ''Individuiamo esattamente il file-device del mouse:''</font>
Riga 242: Riga 238:
 
    
 
    
 
  <FONT color=gray>' ''Per leggere il file-device individuato, bisogna avere i necessari permessi.   
 
  <FONT color=gray>' ''Per leggere il file-device individuato, bisogna avere i necessari permessi.   
  ' ''Pertanto, se non sono stati modificati i permessi del file-device, allora vengono modificati
+
  ' ''Pertanto, se non sono stati modificati i permessi del file-device, allora vengono modificati (bisognerà inserire la propria password ! ):''</font>
' ''(bisognerà inserire la propria password ! ):''</font>
 
 
   Shell "echo ''mia_password'' | sudo -S chmod 4777 /dev/input" &/ s Wait
 
   Shell "echo ''mia_password'' | sudo -S chmod 4777 /dev/input" &/ s Wait
 
      
 
      
Riga 256: Riga 251:
 
  '''Public''' Sub File_Read()
 
  '''Public''' Sub File_Read()
 
   
 
   
  Dim s As String
+
  Dim s As String
  Dim p As Pointer
+
  Dim p As Pointer
  Dim l1, l2, l3, l4 As Long
+
  Dim l1, l2, l3, l4 As Long
  Dim sh1, sh2, sh3, sh4 As Short
+
  Dim sh1, sh2, sh3, sh4 As Short
  Dim i1, i2 As Integer
+
  Dim i1, i2 As Integer
 
    
 
    
 
  <FONT color=gray>' ''Non appena giunge dal file-device qualche dato, lo leggiamo.''
 
  <FONT color=gray>' ''Non appena giunge dal file-device qualche dato, lo leggiamo.''
 
  ' ''Ogni evento che giunge dal mouse con-porta un flusso di più dati contemporaneamente.''
 
  ' ''Ogni evento che giunge dal mouse con-porta un flusso di più dati contemporaneamente.''
  ' Per una più efficace ed intera intercettazione dell'intero fusso, lo leggiamo come stringa:''</font>
+
  ' ''Per una più efficace ed intera intercettazione dell'intero fusso, lo leggiamo come stringa:''</font>
 
   Read #fl, s, -256
 
   Read #fl, s, -256
 
   
 
   
Riga 293: Riga 288:
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 21:39, 29 lug 2021

E' possibile intercettare i dati del mouse dai file-device:

  • /dev/input/mouse(n)
  • /dev/input/mice
  • /dev/input/event(n)

laddove (n) è un numero d'indice.

Questa modalità ci consente di raccogliere i dati del mouse, pur stando con il suo puntatore al di fuori del Form del programma.gambas, oppure nel caso in cui lanciamo un'applicazione Gambas "a riga di comando" dal Terminale.

Bisogna ricordare che, essendo i predetti file-device del mouse protetti, dovremo ottenere preliminarmente i necessari permessi per la loro gestione.


Gestione mediante il file-device: /dev/input/mouse0

Apertura del file-device medinate la Classe Process

Una modalità prevede l'apertura e la gestione del file-device mediante la Classe Process. Per il seguente esempio si inserirà nel Form una TextArea:

Private pr As Process  
 
 
Public Sub Form_Open()  
 
' Se i permessi del file-device del mouse non sono i più ampi...
  If Stat("/dev/input/mouse0").Auth <> "rwsrwxrwx" Then  
' ...allora li modifichiamo. E' necessario scrivere nell'istruzione seguente la nostra password.
' Modificati i permessi, potremo accedere al file-device protetto del mouse:
    Shell "echo 'mia_password' | sudo -S chmod 4777 '/dev/input/mouse0'" Wait
  Endif 
 
' ...quindi potremo gestire il file-device del mouse:
  pr = Shell "cat /dev/input/mouse0" For Read As "pro"
  
End
 
 
Public Sub pro_Read()
  
 Dim s As String
 Dim p As Pointer
 Dim i As Integer
 
  
' Leggiamo i dati dal file-device del mouse...
  Read #pr, s, -256

' Per poter successivamente scomporre i vari dati dall'unica stringa, creiamo da quella stringa un puntatore:
  p = Alloc(s)
' Quindi dereferenziamo il Puntatore con un'apposite funzione di dereferenziazione che restituisce un tipo "Intero", e ne andiamo a leggere il valore:
  i = Int@(p)
   
  Select Case i   ' [Nota 1]

    Case 16711720                  ' spostamento in basso
      FMain.Y = FMain.Y + 1  
      TextArea1.Text = "in basso"    
    Case 65544                     ' spostamento in alto
      FMain.Y = FMain.Y - 1    
      TextArea1.Text = "in alto"    
    Case 264                       ' spostamento a destra
      FMain.X = FMain.X + 1    
      TextArea1.Text = "a destra"    
    Case 65304                     ' spostamento a sinistra
      FMain.X = FMain.X - 1    
      TextArea1.Text = "a sinistra"  
    Case 9                         ' premuto tasto sinistro
      TextArea1.Text = "tasto Sinistro"  
    Case 10                        ' premuto tasto destro
      TextArea1.Text = "tasto Destro"  
    Case 12                        ' premuto tasto centrale
      TextArea1.Text = "tasto Centrale"  
    Case 8                         ' qualsiasi tasto rilasciato
      TextArea1.Text = "tasto Rilasciato" 
 
  End Select    
 
  Free(p)  
     
End


Apertura del file-device con Open.....For Read Watch

Quest'altra modalità prevede l'apertura e la gestione del file-device mediante l'istruzione Open.....For Read Watch:

Private fl As File
  
 
Public Sub Form_Open()  
 
' Se i permessi del file-device del mouse non sono i più ampi...
  If Stat("/dev/input/mouse0").Auth <> "rwsrwxrwx" Then  
' ...allora li modifichiamo. E' necessario scrivere nell'istruzione seguente la nostra password.
' Modificati i permessi, potremo accedere al file-device protetto del mouse:
    Shell "echo 'mia_password' | sudo -S chmod 4777 '/dev/input/mouse0'" Wait
  Endif

' ...quindi apriamo il file per la lettura ed per essere "osservato":
  fl = Open "/dev/input/mouse0" For Read Watch
  
End
 
 
Public Sub File_Read()
  
  Dim s As String
  Dim p As Pointer
  Dim i As Integer
  
' Leggiamo i dati dal file-device del mouse...
  Read #fl, s, -256

  p = Alloc(s)
  i = Int@(p)
   
  Select Case i   ' [Nota 1]

    Case 16711720                  ' spostamento in basso
      FMain.Y = FMain.Y + 1  
      TextArea1.Text = "in basso"    
    Case 65544                     ' spostamento in alto
      FMain.Y = FMain.Y - 1    
      TextArea1.Text = "in alto"    
    Case 264                       ' spostamento a destra
      FMain.X = FMain.X + 1    
      TextArea1.Text = "a destra"    
    Case 65304                     ' spostamento a sinistra
      FMain.X = FMain.X - 1    
      TextArea1.Text = "a sinistra"  
    Case 9                         ' premuto tasto sinistro
      TextArea1.Text = "tasto Sinistro"  
    Case 10                        ' premuto tasto destro
      TextArea1.Text = "tasto Destro"  
    Case 12                        ' premuto tasto centrale
      TextArea1.Text = "tasto Centrale"  
    Case 8                         ' qualsiasi tasto rilasciato
      TextArea1.Text = "tasto Rilasciato" 
 
  End Select    
 
  Free(p)
 
End


...un'applicazione pratica

Come applicazione pratica di quanto descritto nella presente pagina, faremo il caso in cui, cliccando con un paio di tasti del mouse, individueremo ed applicheremo dei comandi su una qualsiasi finestra presente nello schermo. Inoltre al rilascio di un qualunque pulsante conosceremo le coordinate assolute del puntatore del mouse in quel momento sullo schermo (anche se si è cliccato al di fuori di una finestra). Si dovrà avere l'accortezza di inserire nel Form una TextArea, e di aprire le varie finestre, sulle quali testare il seguente codice, prima dell'applicativo:

Private tp As Process
 

Public Sub Form_Open()

   If Stat("/dev/input/mouse0").Auth <> "rwsrwxrwx" Then
     Shell "echo 'mia_password' | sudo -S chmod 4777 '/dev/input/mouse0'" Wait
   Endif
 
   tp = Shell "cat /dev/input/mouse0" For Read As "tp"

End


Public Sub tp_Read()

  Dim s As String
  Dim p As Pointer
  Dim i As Integer
  Dim j As Byte
  Dim dw As DesktopWindow
  
' leggiamo i dati dal file-device del mouse...
  Read #tp, s, -256

  p = Alloc(s)
  i = Int@(p)
 
' Al rilascio di un qualunque tasto conosceremo le coordinate assolute del puntatore del mouse in quel momento sullo schermo (anche se si è cliccato al di fuori di una finestra):
  If i = 8 Then
    TextArea1.Text = "tasto Rilasciato\n" & "\nScreenX = " & Mouse.ScreenX & "\nScreenY = " & Mouse.ScreenY
  Endif
  
  For j = 1 To Desktop.Windows.Count - 1

    dw = New DesktopWindow(Desktop.Windows[j].Id)
    
' Se la finestra cliccata è uguale al nome dell'applicazione, allora si salta al giro successivo, evitando così di chiudere l'applicazione principale:
    If Desktop.Windows[j].VisibleName = Application.Name Then Continue

' Se l'Id della finestra attiva è uguale all'Id della finestra cliccata...
    If Desktop.ActiveWindow = Desktop.Windows[j].Id Then

' ...allora verifica quale tasto del mouse è stato premuto:
      Select Case i
        Case 9         ' tasto Sinistro
' Vengono mostrate nella "TextArea" alcune proprietà della finestra cliccata:
          With dw
            TextArea1.Text = .VisibleName & "\n"
            TextArea1.Text &= .Id & "\n"
            TextArea1.Text &= .X & "\n"
            TextArea1.Text &= .Y & "\n"
            TextArea1.Text &= .W & "\n"
            TextArea1.Text &= .H & "\n"
          End With
        Case 10         ' tasto Destro''
' Se si clica con il tasto destro del mouse, la finestra viene spostata in altre coordinate dello schermo:
          dw.Move(500, 300)
        Case 12         ' tasto Centrale
' Se, invece, si clicca sulla finestra con il tasto centrale del mouse, allora la finestra viene chiusa:
          dw.Close
      End Select  

    Endif

  Next
  
  Free(p)
 
End


Gestione mediante il file-device: /dev/input/event...

L'esempio che riportiamo prevede la gestione dei dati del mouse intercettandoli dal suo file-device /dev/input/event... in un'applicazione "a riga di comando" lanciata da Terminale.

Bisognerà individuare l'esatto file-device del mouse il cui nome termina (sopra abbiamo sostituito l'ultimo carattere con tre puntini) con un numero.

Private fex As File
Private fl As File
Private n As Integer


Public Sub Main()

  Dim s As String

' Individuiamo esattamente il file-device del mouse:
  s = File.Load("/proc/bus/input/devices")  
    
' Individuiamo la riga contenente il testo "Handlers=mouse, e raccogliamo l'ultima parola della riga medesima.
' Tale parola sarà il nome del file-device del mouse:
  s = Trim(Scan(s, "*Handlers=mouse* *\n*")[2])
 
 
' Per leggere il file-device individuato, bisogna avere i necessari permessi.  
' Pertanto, se non sono stati modificati i permessi del file-device, allora vengono modificati (bisognerà inserire la propria password ! ):
  Shell "echo mia_password | sudo -S chmod 4777 /dev/input" &/ s Wait
   
  fex = Open "/dev/stdout" For Write

' Apriamo il file-device in lettura e restiamo in attesa che arrivi qualche evento dal mouse:
  fl = Open "/dev/input" &/ s For Read Watch

End


Public Sub File_Read()

  Dim s As String
  Dim p As Pointer
  Dim l1, l2, l3, l4 As Long
  Dim sh1, sh2, sh3, sh4 As Short
  Dim i1, i2 As Integer
 
' Non appena giunge dal file-device qualche dato, lo leggiamo.
' Ogni evento che giunge dal mouse con-porta un flusso di più dati contemporaneamente.
' Per una più efficace ed intera intercettazione dell'intero fusso, lo leggiamo come stringa:
  Read #fl, s, -256

' Per poter successivamente scomporre i vari dati dall'unica stringa, creiamo da quella stringa un puntatore:
  p = Alloc(s)

' Quindi dereferenziamo il Puntatore con le apposite funzioni di dereferenziazione, e lo andiamo a leggere valore per valore:
  l1 = Long@(p)          ' Secondi
  l2 = Long@(p + 8)      ' Microsecondi
  sh1 = Short@(p + 16)   ' Tipo di evento mouse (2 spostamento mouse o rotazione rotellina; 4 clic)
  sh2 = Short@(p + 18)   ' Sotto-tipo di evento (0 spostamento mouse orizzontale; 1 spostamento verticale; 4 clic; 8 rotazione rotellina)
  i1 = Int@(p + 20)      ' Valore (-1 spostamento a sinistra o in alto, oppure rotellina ruotata indietro; 1 spostamento a destra o in basso, oppure rotellina ruotata in avanti)
  
  l3 = Long@(p + 24)     ' Secondi
  l4 = Long@(p + 32)     ' Microsecondi
  sh3 = Short@(p + 40)   ' Tipo di evento mouse (0 spostamento mouse o rotazione rotellina; 1 clic)
  sh4 = Short@(p + 42)   ' Sotto-tipo di evento (272 clic su tasto sinistro del mouse; 273  clic su tasto destro; 274 clic sulla rotellina/tasto centrale)
  i2 = Int@(p + 44)      ' Valore (0 tasto rilasciato; 1 tasto cliccato)


' Andiamo a vedere nel Terminale medesimo alcuni dati:
  Write #fex, "\r" & sh1 & " " & sh2 & " " & i1 & " " & sh3 & " " & sh4 & " " & i2

' Sfruttando il valore dei "secondi" riportati dalla varibile "l1" (o anche da "l3"),
' mostriamo nel Terminale il numero di secondi trascorsi dal momento in cui l'applicativo è stato lanciato:
  If n = 0 Then n = l1
  Write #fex, "\n\r" & Date(0, 0, 0, 0, 0, 0, (l1 - n) * 1000)

End


Note

[1] Per maggiore completezza riportiamo i tre valori intercettati dal file-device /dev/input/mouse0 del mouse con la modalità sopra mostrata negli esempi (testato con Ubuntu), che prevedono la gestione mediante il file-device /dev/input/mouse0, in base all'azione applicata sul mouse medesimo:

- 65544 = spostamento verso l'alto;
- 65545 = spostamento verso l'alto con tasto sinistro contemporaneamente premuto;
- 65546 = spostamento verso l'alto con tasto destro contemporaneamente premuto;
- 65547 = spostamento verso l'alto con tasti destro e sinistro contemporaneamente premuti;
- 65548 = spostamento verso l'alto con tasto centrale contemporaneamente premuto;
- 65549 = spostamento verso l'alto con tasti sinistro e centrale contemporaneamente premuti;
- 65550 = spostamento verso l'alto con tasti centrale e destro contemporaneamente premuti;
-
- 16711720 = spostamento verso il basso;
- 16711721 = spostamento verso il basso con tasto sinistro contemporaneamente premuto;
- 16711722 = spostamento verso il basso con tasto destro contemporaneamente premuto;
- 16711723 = spostamento verso il basso con tasti destro e sinistro contemporaneamente premuti;
- 16711724 = spostamento verso il basso con tasto centrale contemporaneamente premuto;
- 16711725 = spostamento verso il basso con tasti sinistro e centrale contemporaneamente premuti;
- 16711726 = spostamento verso il basso con tasti centrale e destro contemporaneamente premuti;
-
- 264 = spostamento verso destra;
- 265 = spostamento verso destra con tasto sinistro contemporaneamente premuto;
- 266 = spostamento verso destra con tasto destro contemporaneamente premuto;
- 267 = spostamento verso destra con tasti destro e sinistro contemporaneamente premuti;
- 268 = spostamento verso destra con tasto centrale contemporaneamente premuto;
- 269 = spostamento verso destra con tasti sinistro e centrale contemporaneamente premuti;
- 270 = spostamento verso destra con tasti centrale e destro contemporaneamente premuti;
-
- 65304 = spostamento verso sinistra;
- 65305 = spostamento verso sinistra con tasto sinistro contemporaneamente premuto;
- 65306 = spostamento verso sinistra con tasto destro contemporaneamente premuto;
- 65307 = spostamento verso sinistra con tasti destro e sinistro contemporaneamente premuti;
- 65308 = spostamento verso sinistra con tasto centrale contemporaneamente premuto;
- 65309 = spostamento verso sinistra con tasti sinistro e centrale contemporaneamente premuti;
- 65310 = spostamento verso sinistra con tasti centrale e destro contemporaneamente premuti;
-
- 8 = qualsiasi tasto rilasciato.
- 9 = tasto sinistro premuto;
- 10 = tasto destro premuto;
- 11 = tasti sinistro e destro contemporaneamente premuti;
- 12 = tasto centrale premuto;
- 13 = tasti sinistro e centrale contemporaneamente premuti;
- 14 = tasti centrale e destro contemporaneamente premuti;