linux 如何在bash中获得MouseMove和MouseClick?

zpgglvta  于 2023-08-03  发布在  Linux
关注(0)|答案(7)|浏览(129)

我想知道如何在bash脚本中为我自己的简单操作系统事件获取MouseClick和MouseMove事件。
请告诉我如何得到那个事件。

pobjuy32

pobjuy321#

xterm终端模拟器定义了一些控制序列来进行鼠标跟踪,您可以在xterm发行版文档ctlseqs鼠标跟踪一节中了解更多信息。如果您安装了xterm,您可能会在/usr/share/doc/xterm/ctlseqs.txt.gz或类似的路径中有一个副本。
大多数运行在X Window系统上的终端模拟器(例如:Konsole,gnome-terminal,eterm,...)理解这些控制序列中的至少一些。如果你想直接在Linux的虚拟终端上使用它们,你可能需要运行gpm(8)
有几个控制序列可用于启用和禁用鼠标移动报告:

  • 9 -> X10鼠标报告,为了与X10的xterm兼容,报告按钮按下情况。
  • 1000 -> X11鼠标报告,报告按钮按下和释放。
  • 1001 ->突出显示报告,用于报告鼠标突出显示。
  • 1002 ->按钮移动报告,报告按下按钮时的移动。
  • 1003 ->所有移动报告,报告所有移动。

控制序列为CSI ? number h用于启用,CSI ? number l用于禁用。CSI是ESC [或字符0x9b。因此,您可以按如下方式使用它们:

echo -e "\e[?1000h"

字符串
然后,您将在按下按钮时获得一堆字符,详细信息请参阅ctlseqsconsole_codes(4)。然后,您可以使用以下命令禁用鼠标跟踪:

echo -e "\e[?1000l"


不幸的是,以前的鼠标报告模式只能处理最多223(255 - 32)的坐标,或者在某些情况下95(127 - 32)。因此,有一些新的开关可以更改报告鼠标坐标的格式:

  • 1006 ->报告为十进制值(xterm,许多其他终端模拟器,但不是urxvt)
  • 1015 ->以十进制值报告(urxvt,xterm,其他终端模拟器,一些应用程序发现解析起来很复杂)
  • 1005 ->报告返回编码为UTF-8(xterm,urxvt,以多种方式中断)

应用程序的一个好策略是启用鼠标报告,然后(可选地请求urxvt 1015模式,然后)请求SGR 1006模式。应用程序应该处理新的和遗留的鼠标报告响应,以继续在不支持新模式的终端模拟器上工作。
有关新报告模式的更多信息,请访问:

6yt4nkrj

6yt4nkrj2#

根据这里提供的宝贵信息,经过一番挖掘。
我们可以捕捉到鼠标的唐斯和释放、滚轮的移动和侧移、鼠标中键点击(滚轮点击)和位置。无右键单击。
以下只是php中的一个示例,作为cli使用。它隐藏了终端上打印的动作,并在退出时将其正确地设置回来。
它足够详细,可以适应任何能够读取STDIN并打印到STDOUT的编程语言,所以肯定有一个很大的列表!

#!/usr/bin/php
<?php
system("stty -icanon");                                  // Enable shell input
system("stty -echo");                                    // Disable characters printing
echo "\e[?1003h\e[?1015h\e[?1006h";                      // Mouse trap all, urxvt, SGR1006  

function shutdown(){                                     // Cleaning before quiting
    echo "\e[?1000l";                                    // Disable mouse trap
    system("stty echo");                                 // Enable back characters printing
    exit;                                                // Cleaned, quit
}
register_shutdown_function("shutdown");                  // Handle regular END of script

declare(ticks = 1);                                      // Allow posix signal handling
pcntl_signal(SIGINT,"shutdown");                         // Catch SIGINT (CTRL+C)   

$KEY = "";
while ($KEY = fread(STDIN,16)) {
  $e = explode(";",explode("<",$KEY)[1]);
  if ($e[0] === "0" && substr($e[2],-1) === "M"){
     echo "BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
  if ($e[0] === "0" && substr($e[2],-1) === "m"){
     echo "BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
  if ($e[0] === "64"){
     echo "WHEEL SCROLL UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
  if ($e[0] === "65"){
     echo "WHEEL SCROLL DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
  if ($e[0] === "1" && substr($e[2],-1) === "M"){
     echo "WHEEL BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
  if ($e[0] === "1" && substr($e[2],-1) === "m"){
     echo "WHEEL BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
  if ($e[0] === "35"){
     echo "MOUSE MOVE, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n"; 
  }
}

字符串
x1c 0d1x的数据

lyr7nygr

lyr7nygr3#

捷径

1.启用xterm鼠标跟踪报告
1.设置readline绑定以使用单击生成的转义序列

漫漫长路

Xterm有鼠标跟踪功能

echo -e "\e[?1000;1006;1015h" # Enable tracking
echo -e "\e[?1000;1006;1015l" # Disable tracking

字符串

  • 鼠标点击看起来像\e[<0;3;21M和释放\e[<0;3;21m。其中3是x,21是y,从左上角开始,从1开始。(注意,它是x-y而不是row-col)。
  • 鼠标旋转起来:\e[<64;3;21M
  • 鼠标下降:\e[<65;3;21M
  • 在启用鼠标跟踪后,按Ctrl + v或输入read可看到

Readline可以触发bash回调

bind -x '"\e[<64;": mouse_void_cb' # Cannot be put in .inputrc
bind    '"\C-h"   : "$(date) \e\C-e\ef\ef\ef\ef\ef"' #Can be put in .inputrc


Readline可以调用多个函数

# Mouse cursor to begining-of-line before calling click callback
bind    '"\C-98" : beginning-of-line'
bind -x '"\C-99" : mouse_0_cb'
bind    '"\e[<0;": "\C-98\C-99"'


Readline回调可以通过READLINE_POINT环境变量改变光标(点)位置

bind -x '"\C-h"  : xterm_test'
function xterm_test {
    echo "line is $READLINE_LINE and point $READLINE_POINT"
    READLINE_POINT=24    # The cursor position (0 for begining of command)
    READLINE_LINE='coco' # The command line current content
}

友情链接

0qx6xfy6

0qx6xfy64#

bash不知道任何关于鼠标或鼠标点击的事情。默认情况下没有光标或类似的东西。
您可以安装“通用鼠标服务器”。看看这个例如http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html,在控制台中使用复制和粘贴。也许您可以使用这些工具来处理您的bash脚本。
……但无论如何:bash-shell没有本地鼠标支持

kgqe7b3p

kgqe7b3p5#

你可以使用xdotool来处理mousemove和mouseclick事件。xdotool是一个伪造键盘和鼠标的工具。输入sudo apt-get install xdotool进行安装。通过使用xdotool,您可以自动化几乎所有您使用键盘和鼠标所做的事情。

zrfyljdw

zrfyljdw6#

您可以使用'xautomation'包中的命令'xte'。

apt-get install xautomation

字符串
作为示例,可以注意到以下命令:

xte 'mousemove 200 300'


因此,鼠标指针移动到屏幕的宽度200和高度300。作为另一个例子,我们有:

xte 'mouseclick 3'


点击鼠标右键(1:左键单击,2:中键点击,3:右击)。此外,您可以通过 shell 按键盘上的键:

xte 'keydown Control_L' 'key c' 'keyup Control_L'


这个例子发送ctrl+c到shell。

irlmq6kh

irlmq6kh7#

我希望你能理解GoLang:)
基于这个评论。<3

package main

import (
  "fmt"
  "strings"
  "strconv"

  "github.com/pandasoli/goterm"
)

func main() {
  termios, _ := goterm.SetRawMode()
  defer goterm.RestoreMode(termios)

  fmt.Print("\033[?1003h\033[?1015h\033[?1006h") // Mouse trap all, urxvt, SGR1006
  fmt.Print("\033[?1002h") // Enable mouse motion reporting

  defer fmt.Print("\033[?1002l") // Disable mouse trap
  defer fmt.Print("\033[?1003l\033[?1015l\033[?1006l") // Restore mouse mode and SGR1006

  for {
    key, _ := goterm.Getch()

    if key == "q" { break }

    if strings.HasPrefix(key, "\033[<") {
      list := strings.Split(key[3:], ";")

      ev := list[0]
      x, _ := strconv.Atoi(list[1])
      y, _ := strconv.Atoi(list[2][:len(list[2]) - 1])
      kind := list[2][len(list[2]) - 1]

      switch ev {
      case "0":
        if kind == 'M' {
          fmt.Printf("(%d, %d) Left mouse down\n", x, y)
        } else if kind == 'm' {
          fmt.Printf("(%d, %d) Left mouse up\n", x, y)
        }
      case "1":
        if kind == 'M' {
          fmt.Printf("(%d, %d) Wheel button down\n", x, y)
        } else if kind == 'm' {
          fmt.Printf("(%d, %d) Wheel button up\n", x, y)
        }
      case "2":
        if kind == 'M' {
          fmt.Printf("(%d, %d) Right mouse down\n", x, y)
        } else if kind == 'm' {
          fmt.Printf("(%d, %d) Right mouse up\n", x, y)
        }
      case "32":
        if kind == 'M' {
          fmt.Printf("(%d, %d) Left mouse pressed move\n", x, y)
        }
      case "34":
        if kind == 'M' {
          fmt.Printf("(%d, %d) Right mouse pressed move\n", x, y)
        }
      case "35":
        fmt.Printf("(%d, %d) Mouse move\n", x, y)
      case "64":
        fmt.Printf("(%d, %d) Wheel scroll up\n", x, y)
      case "65":
        fmt.Printf("(%d, %d) Wheel scroll down\n", x, y)
      default:
        code := strings.ReplaceAll(key, "\033", "\\033")
        panic(fmt.Errorf("Could not understand mouse input: \"%s\".", code))
      }
    } else {
      result := key
      codes := [][]string {
        { "\033", "\\033" },
        { "\b", "\\b" },
        { "\n", "\\n" },
        { "\x7f", "\\x7f" },
      }

      for _, code := range codes {
        result = strings.ReplaceAll(result, code[0], code[1])
      }

      fmt.Printf("Pressed key \"%s\" %v\n", result, []byte(key))
    }
  }
}

字符串

相关问题