我想知道如何在bash脚本中为我自己的简单OS事件获取MouseClick和MouseMove事件。
请告诉我如何获得这些活动。
答案 0 :(得分:30)
xterm终端仿真器定义了一些控制序列以进行鼠标跟踪,您可以在文档ctlseqs的鼠标跟踪部分中了解有关它们的更多信息,以便进行xterm分发。如果你安装了xterm,你可能会在/usr/share/doc/xterm/ctlseqs.txt.gz
或类似的路径上复制一份。
在X Window系统上运行的大多数终端仿真器(例如:Konsole,gnome-terminal,eterm,...)至少了解其中一些控制序列。如果你想直接在Linux的一个虚拟终端上使用它们,你可能需要运行gpm(8)
。
有几个控制序列可用于启用和禁用鼠标移动报告:
控制序列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)。因此,有一些新的开关可以改变报告鼠标坐标的格式:
应用程序的一个好策略是启用鼠标报告,然后(可选地请求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)
我制作了一个脚本来使命令行鼠标单击时移动光标:
可以在这里找到: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";
}
}
答案 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。