如何在bash中获取MouseMove和鼠标?

时间:2011-05-11 15:38:15

标签: linux events bash scripting

我想知道如何在bash脚本中为我自己的简单OS事件获取MouseClick和MouseMove事件。

请告诉我如何获得这些活动。

6 个答案:

答案 0 :(得分:30)

xterm终端仿真器定义了一些控制序列以进行鼠标跟踪,您可以在文档ctlseqs鼠标跟踪部分中了解有关它们的更多信息,以便进行xterm分发。如果你安装了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"

然后,按下按钮会得到一堆字符,详情请参阅 ctlseqs console_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模式。该应用程序应处理新旧鼠标报告响应,以继续处理终端仿真器而不支持新模式。

有关新报告模式的更多信息,请访问:

答案 1 :(得分:4)

bash对鼠标或鼠标点击一无所知。 默认情况下,没有光标或类似的东西。

您可以安装“通用鼠标服务器”。 看看这个:http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html 例如,在控制台中使用复制和粘贴。 也许你可以使用这些工具来处理你的bash脚本。

...但是根本没有:bash-shell没有本机鼠标支持

答案 2 :(得分:1)

您可以使用xdotool进行mousemove和mouseclick事件。 xdotool是一种伪造键盘和鼠标的工具。 通过输入安装它, sudo apt-get install xdotool。 通过使用xdotool,您可以使用键盘和鼠标自动执行几乎所有操作。

答案 3 :(得分:1)

快捷方式

我制作了一个脚本来使命令行鼠标单击时移动光标

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

可以在这里找到:https://github.com/tinmarino/mouse_xterm/blob/master/mouse.sh

很远

Xterm具有鼠标跟踪功能

echo -e "\e[?1000;1006;1015h" # Enable tracking
echo -e "\e[?1000;1006;1015l" # Disable tracking
  • 鼠标单击看起来像\e[<0;3;21M和发行版\e[<0;3;21。其中2是x(从左到右),22是y(从左到右)
  • 鼠标叫醒了:\e[<64;3;21M
  • 鼠标摇摇欲坠:\e[<65;3;21M
  • 启用鼠标跟踪后按C-v即可看到

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
}

链接

答案 4 :(得分:1)

根据此处提供的宝贵信息,并进行了一些挖掘。

我们可以捕获鼠标的下移和释放,滚轮的移动和侧面,中间的单击(滚轮单击)以及位置。没有右键单击。

以下只是php中的示例。它隐藏了终端上打印的动作,并在退出时将其正确设置回去。

它很冗长,可以适应任何能够读取 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"; 
  }
}

enter image description here

答案 5 :(得分:0)

您可以使用命令&#39; xte&#39;来自包装&#39; xautomation&#39;。

apt-get install xautomation

例如,可以注意以下命令:

xte 'mousemove 200 300'

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

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

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

此示例将ctrl + c发送到shell。