如何在 bash 中获取 MouseMove 和 MouseClick?
- 2024-11-01 08:41:00
- admin 原创
- 59
问题描述:
我想知道如何在 Bash 脚本中获取 MouseClick 和 MouseMove 事件用于我自己的简单操作系统事件。
请告诉我如何获取该事件。
解决方案 1:
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"
然后,按下按钮时您将获得一堆字符,有关详细信息,请参阅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 模式。应用程序应该处理新旧鼠标报告响应,以便在不支持新模式的情况下继续在终端仿真器上工作。
有关新报告模式的更多信息,请访问:
午夜指挥官票#2956
tmux 票证 #26
午夜指挥官票#2662
解决方案 2:
根据这里提供的宝贵信息,并经过一番挖掘。
我们可以捕捉鼠标按下和释放、滚轮移动和侧移、鼠标中键单击(滚轮单击)和位置。没有右键单击。
以下只是php 中的一个示例,用作 cli。它隐藏了终端上打印的动作,并在退出时将其正确设置回来。
它足够详细,可以适应任何能够读取STDIN并打印到STDOUT的编程语言,所以肯定有一个很大的列表!
#!/usr/bin/php
<?php
system("stty -icanon"); // Enable shell input
system("stty -echo"); // Disable characters printing
echo "e[?1003he[?1015he[?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]."
";
}
if ($e[0] === "0" && substr($e[2],-1) === "m"){
echo "BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."
";
}
if ($e[0] === "64"){
echo "WHEEL SCROLL UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."
";
}
if ($e[0] === "65"){
echo "WHEEL SCROLL DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."
";
}
if ($e[0] === "1" && substr($e[2],-1) === "M"){
echo "WHEEL BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."
";
}
if ($e[0] === "1" && substr($e[2],-1) === "m"){
echo "WHEEL BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."
";
}
if ($e[0] === "35"){
echo "MOUSE MOVE, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."
";
}
}
解决方案 3:
捷径
启用 xterm 鼠标跟踪报告
设置 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 开始。(请注意,它是 xy 而不是 row-col)。鼠标向上滚动:
e[<64;3;21M
鼠标向下滑动:
e[<65;3;21M
启用鼠标跟踪后按
Ctrl + v
或 Enter 键read
即可看到
Readline 可以触发 bash 回调
bind -x '"e[<64;": mouse_void_cb' # Cannot be put in .inputrc
bind '"C-h" : "$(date) eC-eefefefefef"' #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-98C-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
}
链接
用于鼠标跟踪的 bash 脚本:免责声明,我是该脚本的作者
用于鼠标跟踪的 zsh 脚本:相同,但在 zsh 中(不是 bash)
Ctrl 键与 vim 源代码中使用的一样
Invisible-Island:Xterm 控制序列的参考(
vim /usr/share/doc/xterm/ctlseqs.txt.gz
)
解决方案 4:
bash 对鼠标或鼠标点击一无所知。默认情况下没有光标或类似的东西。
您可以安装“通用鼠标服务器”。例如,查看:http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html
,以便在控制台内使用复制和粘贴。也许您可以使用这些工具来处理您的 bash 脚本。
...但根本没有:bash-shell 没有原生的鼠标支持
解决方案 5:
您可以使用包“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。
解决方案 6:
我希望你能理解GoLang :)
根据这条评论。<3
package main
import (
"fmt"
"strings"
"strconv"
"github.com/pandasoli/goterm"
)
func main() {
termios, _ := goterm.SetRawMode()
defer goterm.RestoreMode(termios)
fmt.Print("[?1003h[?1015h[?1006h") // Mouse trap all, urxvt, SGR1006
fmt.Print("[?1002h") // Enable mouse motion reporting
defer fmt.Print("[?1002l") // Disable mouse trap
defer fmt.Print("[?1003l[?1015l[?1006l") // Restore mouse mode and SGR1006
for {
key, _ := goterm.Getch()
if key == "q" { break }
if strings.HasPrefix(key, "[<") {
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
", x, y)
} else if kind == 'm' {
fmt.Printf("(%d, %d) Left mouse up
", x, y)
}
case "1":
if kind == 'M' {
fmt.Printf("(%d, %d) Wheel button down
", x, y)
} else if kind == 'm' {
fmt.Printf("(%d, %d) Wheel button up
", x, y)
}
case "2":
if kind == 'M' {
fmt.Printf("(%d, %d) Right mouse down
", x, y)
} else if kind == 'm' {
fmt.Printf("(%d, %d) Right mouse up
", x, y)
}
case "32":
if kind == 'M' {
fmt.Printf("(%d, %d) Left mouse pressed move
", x, y)
}
case "34":
if kind == 'M' {
fmt.Printf("(%d, %d) Right mouse pressed move
", x, y)
}
case "35":
fmt.Printf("(%d, %d) Mouse move
", x, y)
case "64":
fmt.Printf("(%d, %d) Wheel scroll up
", x, y)
case "65":
fmt.Printf("(%d, %d) Wheel scroll down
", x, y)
default:
code := strings.ReplaceAll(key, "", "\\033")
panic(fmt.Errorf("Could not understand mouse input: \"%s\".", code))
}
} else {
result := key
codes := [][]string {
{ "", "\\033" },
{ "", "\\b" },
{ "
", "\\n" },
{ "x7f", "\" },
}
for _, code := range codes {
result = strings.ReplaceAll(result, code[0], code[1])
}
fmt.Printf("Pressed key \"%s\" %v
", result, []byte(key))
}
}
}
解决方案 7:
您可以使用 xdotool 来处理鼠标移动和鼠标单击事件。xdotool 是一个模拟键盘和鼠标的工具。通过输入 sudo apt-get install xdotool 来安装它。通过使用 xdotool,您可以自动执行几乎所有使用键盘和鼠标进行的操作。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件