Есть ли способ выполнить команду каждый раз, когда мышь движется?

Я хотел бы запускать сценарий каждый раз, когда я двигаю мышью.

Это первый шаг к обходному пути, чтобы я мог использовать 100% краев монитора для перехода между ними.

Это возможно?

2 ответа

Вопрос буквально

Обнаружение движения мыши, может быть сделано с помощью нескольких инструментов. Два примера:

  1. С помощью xdotool в скрипте:
    [тебе нужно xdotool быть установленным]:

    sudo apt-get install xdotool
    
    • Сравните (в цикле) две позиции мыши с интервалом времени:
      Команда для получения положения мыши xdotool:

      $ xdotool getmouselocation
      x:1449 y:137 screen:0 window:79691788
      
    • Если мы проанализируем этот вывод в скрипте (python), мы можем позволить ему выполнить команду, если мышь двигается (если position1 не равна 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. Использование (питона) tkinterТочно такой же процесс можно сделать с pythonсобственный tkinter:

    [тебе нужно tkinter3 быть установленным]:

    sudo apt-get install python3-tk
    
    • Сценарий, используя 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()
      

Пример, связанный с тем, к чему вы стремитесь

Пример того, что можно сделать, чтобы контролировать, какую команду запускать, когда мышь нарушает определенную позицию (линию) ниже.

#!/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

В этом примере мышь делает прыжок, когда вы перемещаете его слева направо или наоборот:

введите описание изображения здесь

В этом случае мышь прыгает с фиксированным прыжком. Однако, добавив немного математики и переместив линию перехода в правую часть экрана (+ отдельное "расположение" в верхнем левом углу второго экрана), вы можете выполнить переход пропорционально, чтобы создать настройку, в которой вы находитесь. Цель первого вопроса: сделать так, чтобы (при настройке двух экранов) оба экрана выглядели одинаково по вертикали при перемещении мыши с одного экрана на другой.

"Мертвого угла", где вы не можете перемещать мышь с одного экрана на другой, тогда бы не было. (У меня на двух экранах рабочая ситуация)

Однако это все равно будет иметь странный эффект для окон, если они распределены по двум экранам, но это можно сделать.

введите описание изображения здесь

Нет, это невозможно без настройки драйверов вашей X-среды. Должны быть методы изменения конфигурации, чтобы делать то, что вы хотите.

Другие вопросы по тегам