我想知道如何在bash脚本中为我自己的简单操作系统事件获取MouseClick和MouseMove事件。请告诉我如何得到那个事件。
pobjuy321#
xterm终端模拟器定义了一些控制序列来进行鼠标跟踪,您可以在xterm发行版文档ctlseqs的鼠标跟踪一节中了解更多信息。如果您安装了xterm,您可能会在/usr/share/doc/xterm/ctlseqs.txt.gz或类似的路径中有一个副本。大多数运行在X Window系统上的终端模拟器(例如:Konsole,gnome-terminal,eterm,...)理解这些控制序列中的至少一些。如果你想直接在Linux的虚拟终端上使用它们,你可能需要运行gpm(8)。有几个控制序列可用于启用和禁用鼠标移动报告:
/usr/share/doc/xterm/ctlseqs.txt.gz
gpm(8)
控制序列为CSI ? number h用于启用,CSI ? number l用于禁用。CSI是ESC [或字符0x9b。因此,您可以按如下方式使用它们:
CSI ? number h
CSI ? number l
ESC [
0x9b
echo -e "\e[?1000h"
字符串然后,您将在按下按钮时获得一堆字符,详细信息请参阅ctlseqs或console_codes(4)。然后,您可以使用以下命令禁用鼠标跟踪:
console_codes(4)
echo -e "\e[?1000l"
型不幸的是,以前的鼠标报告模式只能处理最多223(255 - 32)的坐标,或者在某些情况下95(127 - 32)。因此,有一些新的开关可以更改报告鼠标坐标的格式:
应用程序的一个好策略是启用鼠标报告,然后(可选地请求urxvt 1015模式,然后)请求SGR 1006模式。应用程序应该处理新的和遗留的鼠标报告响应,以继续在不支持新模式的终端模拟器上工作。有关新报告模式的更多信息,请访问:
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的数据
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
21
\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环境变量改变光标(点)位置
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 }
型
vim /usr/share/doc/xterm/ctlseqs.txt.gz
0qx6xfy64#
bash不知道任何关于鼠标或鼠标点击的事情。默认情况下没有光标或类似的东西。您可以安装“通用鼠标服务器”。看看这个例如http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html,在控制台中使用复制和粘贴。也许您可以使用这些工具来处理您的bash脚本。……但无论如何:bash-shell没有本地鼠标支持
kgqe7b3p5#
你可以使用xdotool来处理mousemove和mouseclick事件。xdotool是一个伪造键盘和鼠标的工具。输入sudo apt-get install xdotool进行安装。通过使用xdotool,您可以自动化几乎所有您使用键盘和鼠标所做的事情。
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。
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)) } } }
7条答案
按热度按时间pobjuy321#
xterm终端模拟器定义了一些控制序列来进行鼠标跟踪,您可以在xterm发行版文档ctlseqs的鼠标跟踪一节中了解更多信息。如果您安装了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
。因此,您可以按如下方式使用它们:字符串
然后,您将在按下按钮时获得一堆字符,详细信息请参阅ctlseqs或
console_codes(4)
。然后,您可以使用以下命令禁用鼠标跟踪:型
不幸的是,以前的鼠标报告模式只能处理最多223(255 - 32)的坐标,或者在某些情况下95(127 - 32)。因此,有一些新的开关可以更改报告鼠标坐标的格式:
应用程序的一个好策略是启用鼠标报告,然后(可选地请求urxvt 1015模式,然后)请求SGR 1006模式。应用程序应该处理新的和遗留的鼠标报告响应,以继续在不支持新模式的终端模拟器上工作。
有关新报告模式的更多信息,请访问:
6yt4nkrj2#
根据这里提供的宝贵信息,经过一番挖掘。
我们可以捕捉到鼠标的唐斯和释放、滚轮的移动和侧移、鼠标中键点击(滚轮点击)和位置。无右键单击。
以下只是php中的一个示例,作为cli使用。它隐藏了终端上打印的动作,并在退出时将其正确地设置回来。
它足够详细,可以适应任何能够读取STDIN并打印到STDOUT的编程语言,所以肯定有一个很大的列表!
字符串
x1c 0d1x的数据
lyr7nygr3#
捷径
1.启用xterm鼠标跟踪报告
1.设置readline绑定以使用单击生成的转义序列
漫漫长路
Xterm有鼠标跟踪功能
字符串
\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回调
型
Readline可以调用多个函数
型
Readline回调可以通过
READLINE_POINT
环境变量改变光标(点)位置型
友情链接
vim /usr/share/doc/xterm/ctlseqs.txt.gz
)0qx6xfy64#
bash不知道任何关于鼠标或鼠标点击的事情。默认情况下没有光标或类似的东西。
您可以安装“通用鼠标服务器”。看看这个例如http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html,在控制台中使用复制和粘贴。也许您可以使用这些工具来处理您的bash脚本。
……但无论如何:bash-shell没有本地鼠标支持
kgqe7b3p5#
你可以使用xdotool来处理mousemove和mouseclick事件。xdotool是一个伪造键盘和鼠标的工具。输入sudo apt-get install xdotool进行安装。通过使用xdotool,您可以自动化几乎所有您使用键盘和鼠标所做的事情。
zrfyljdw6#
您可以使用'xautomation'包中的命令'xte'。
字符串
作为示例,可以注意到以下命令:
型
因此,鼠标指针移动到屏幕的宽度200和高度300。作为另一个例子,我们有:
型
点击鼠标右键(1:左键单击,2:中键点击,3:右击)。此外,您可以通过 shell 按键盘上的键:
型
这个例子发送ctrl+c到shell。
irlmq6kh7#
我希望你能理解GoLang:)
基于这个评论。<3
字符串