Existe uma maneira de executar um comando toda vez que o mouse se move?

2

Eu gostaria de executar um script toda vez que movo meu mouse.

Este é o primeiro passo para fazer uma solução alternativa para que eu possa usar 100% das bordas do meu monitor vão entre elas .

Isso é possível?

    
por Jack 14.02.2015 / 01:20

2 respostas

4

A questão literalmente

Detectar o movimento do mouse , pode ser feito com várias ferramentas. Dois exemplos:

  1. Usando xdotool em um script:
    [você precisaria que o xdotool fosse instalado]:

    sudo apt-get install xdotool
    
    • Compare (em um loop) duas posições do mouse, com um intervalo de tempo:
      O comando para obter a posição do mouse de xdotool :

      $ xdotool getmouselocation
      x:1449 y:137 screen:0 window:79691788
      
    • Se analisarmos essa saída em um script (python), podemos deixar que ele execute um comando se o mouse se mover (se position1 não for igual a position2):

      #!/usr/bin/env python3
      import subprocess
      import time
      
      def get_mousepos():
          curr = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
          return [int(it.split(":")[1]) for it in curr.split()[:2]]
      
      current1 = get_mousepos()
      while True:
          time.sleep(0.5)
          current2 = get_mousepos()
          if not current1 == current2:
              # run a command:
              print("action")
          current1 = current2
      
  2. Usando (python's) tkinter O mesmo processo exato também pode ser feito com o próprio python : tkinter :

    [você precisaria que o tkinter3 fosse instalado]:

    sudo apt-get install python3-tk
    
    • O script, usando tkinter :

      #!/usr/bin/env python3
      from tkinter import*
      import time
      
      root = Tk()
      
      def current_position():
          return [root.winfo_pointerx(), root.winfo_pointery()]
      
      pos1 = current_position()
      while True:
         time.sleep(0.5)
          pos2 = current_position()
          if not pos1 == pos2:
              # run a command:
              print("action!")
          pos1 = pos2
      
      root.mainloop()
      

Um exemplo relacionado ao que você está procurando

Um exemplo do que pode ser feito para controlar o comando a ser executado quando o mouse ultrapassa uma determinada posição (linha) abaixo.

#!/usr/bin/env python3
import subprocess

def get_mousepos():
    curr = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
    return [int(it.split(":")[1]) for it in curr.split()[:2]]

current1 = get_mousepos()
while True:
    current2 = get_mousepos()
    # make the jump depend on the position and direction:
    jump = 100 if current2[1] < 525 else -100
    if current2[0] < 1000 and current1[0] >= 1000:
        print("gone left") # you can run any other command here, like:
        subprocess.Popen(["xdotool", "mousemove", str(current2[0]), str(current2[1]+jump)])
    elif current2[0] > 1000 and current1[0] <= 1000:
        print("gone right") # you can run any other command here
        subprocess.Popen(["xdotool", "mousemove", str(current2[0]), str(current2[1]-jump)])
    current1 = current2

Neste exemplo, o mouse faz um pulo quando você o move da esquerda para a direita ou vice-versa:

Neste caso, o mouse salta um salto fixo . No entanto, jogando matemática e movendo a linha de salto para o lado direito da tela (+ um "arranjo" separado para o canto superior esquerdo da segunda tela), você pode fazer o salto proporcionalmente , para criar a configuração que você deseja em sua primeira pergunta: faça (em uma configuração de tela dupla) as duas telas parecem da mesma resolução vertical ao mover o mouse de uma tela para outra.

O "canto morto", onde você não pode mover o mouse de uma tela para outra, não existiria. (Eu tenho uma situação de trabalho em minhas duas telas)

No entanto, ainda teria um efeito estranho com o windows se eles estiverem distribuídos nas duas telas, mas isso pode ser feito.

    
por Jacob Vlijm 23.02.2015 / 23:05
0

Não, não é possível sem personalizar os drivers do seu ambiente X. Deve haver métodos de mudança de configuração para fazer o que você quer.

    
por Asaf Bartov 14.02.2015 / 01:34