web-dev-qa-db-ja.com

マウスが動くたびにコマンドを実行する方法はありますか?

マウスを動かすたびにスクリプトを実行したいと思います。

これは、 モニターの端の100%がそれらの間を移動する を使用できるようにするための回避策を作成する最初のステップです。

これは可能ですか?

3
Jack

質問は文字通り

マウスの検出movementは、いくつかのツールで実行できます。 2つの例:

  1. スクリプトでxdotoolを使用する:
    [xdotoolをインストールする必要があります]:

    Sudo apt-get install xdotool
    
    • 時間間隔を空けて、2つのマウス位置を(ループで)比較します。
      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. (pythonの)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

この例では、マウスを左から右へ、またはその逆に移動すると、マウスがジャンプします。

enter image description here

この場合、マウスは固定ジャンプにジャンプします。ただし、いくつかの数学を投入し、ジャンプラインを画面の右側に移動します(2番目の画面の左上に別の「配置」)、ジャンプを行うことができます比例、最初の質問で目指しているセットアップを作成するには:マウスをある画面から別の画面に移動するときに、両方の画面を同じ画面解像度(seem)にします。

ある画面から別の画面にマウスを移動できない「デッドコーナー」は存在しません。 (2つの画面に作業状況があります)

ただし、ウィンドウが2つの画面にまたがっている場合、ウィンドウには奇妙な効果がありますが、実行できます。

enter image description here

5
Jacob Vlijm

いいえ、X環境のドライバーをカスタマイズしなければ不可能です。必要なことを行うには、構成変更メソッドが必要です。

0
Asaf Bartov