检测是否按下了鼠标按钮,然后调用脚本或命令


11

有什么办法可以从bash获取鼠标按钮状态吗?Xdotool只能获取鼠标位置。

我想在可以定义规则的地方进行设置,当按下鼠标按钮时,可以执行脚本。


您当然可以检测到鼠标事件,但是我不相信有一种方法可以询问系统当前是否正在按下鼠标按钮。每个鼠标活动解析器我见过的手表,如果你能原谅的伪代码,MouseButton1Down并且MouseButton1Up事件时采取行动。
DopeGhoti 2013年

我需要一些脚本来监视鼠标,当按下鼠标左键时,它将执行某些操作。
MartinP 2013年

需要澄清。在外壳中时,您是否需要某种东西,然后单击终端窗口,该特定外壳会做什么?还是您想要它,以便当您在运行脚本的任何地方单击特定的鼠标按钮时(而无需在终端中查看脚本)?
帕特里克

我需要脚本,它将运行,然后它将监视桌面上任何地方的鼠标按钮。它不会阻塞鼠标,只会监听它。我试图用Xlib在C中为它编写程序,但是它只具有XGrabButton和XGrabPointer,而我不想要,因为它抓住了指针,而另一个窗口没有注册单击事件。
MartinP

Answers:


11
xinput --query-state <mouse_id>

这为您提供了所有鼠标按钮的状态,如下所示:

2 classes :
ButtonClass
    button[1]=up
    button[2]=up
    button[3]=up
    button[4]=up
    button[5]=up
    button[6]=up
    button[7]=up
    button[8]=up
    button[9]=up
    button[10]=up
    button[11]=up
    button[12]=up
    button[13]=up
    button[14]=up
    button[15]=up
    button[16]=up
ValuatorClass Mode=Relative Proximity=In
    valuator[0]=313
    valuator[1]=667
    valuator[2]=-20

mouse_id可以从以下位置获得:

xinput --list

这是一个小的鼠标按钮监视程序脚本:

#!/bin/bash

MOUSE_ID=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')

STATE1=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
while true; do
    sleep 0.2
    STATE2=$(xinput --query-state $MOUSE_ID | grep 'button\[' | sort)
    comm -13 <(echo "$STATE1") <(echo "$STATE2")
    STATE1=$STATE2
done

您可能需要将MOUSE_ID检测字符串('mouse')更改为其他名称。


xinput --list给我X Input extension not available.。可悲的是,对于此事,Google并未透露任何对我而言有用的东西:Xvnc4在最小的Debian VM中。 我可能不走运
-Tino

6

您可以使用命令行工具xev找出X环境中鼠标按钮的状态。

$ xev
...
ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064320, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319064439, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065208, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

ButtonRelease event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319065337, (164,14), root:(166,101),
    state 0x100, button 1, same_screen YES

ButtonPress event, serial 36, synthetic NO, window 0x3800001,
    root 0x86, subw 0x0, time 319066059, (164,14), root:(166,101),
    state 0x0, button 1, same_screen YES

但是,这些信息只能使您部分地找到解决方案。您要从上方提取的关键信息是与鼠标上的特定按钮关联的数字。在我的示例中,我按下了左按钮“ buton 1”。

xbindkeys

您可以使用此工具来设置与按下的按钮相关联的操作。您甚至可以设置一条规则,该规则要求同时按下一个键或什至一个键+按钮。

您首先需要确保已安装软件包xbindkeys。

然后,仅需运行一次以下命令即可创建模板xbindkeys配置文件。

$ xbindkeys --defaults > /home/saml/.xbindkeysrc

创建文件后,您可以在文本编辑器中将其打开并添加如下规则:

"xterm"
  b:3

该规则表明我们要在xterm按下按钮3时运行程序。“按钮3”是我的鼠标右键。

进行上述更改后,如果xbindkeys已经运行,则需要将其杀死,然后重新启动它。

$ killall xbindkeys
$ xbindkeys

现在,只要我单击鼠标右键,xterm就可以运行该程序,它将执行。

参考文献


2
但这仅适用于创建的窗口。我怎样才能在全球范围内捕捉到该事件?
MartinP

4

如果您只想在鼠标单击(或wheel事件)时在xterm中运行bash命令,则可以尝试以下示例:

$ echo -e "\e[?1000h"
$ while read -n 6; do echo hellowworld; done

这是用于转盘事件(而不是单击设置12)


拜托,你能解释一下吗?
lucaswxp

2

您无法进行蛋糕按钮按下事件并食用。如果您希望脚本收到鼠标事件,那么鼠标事件将发送到您的脚本而不是其他任何应用程序,这意味着您的脚本必须捕获鼠标事件。如果您的脚本没有声明该事件,则应该获取该事件的窗口将其获取。

如果需要,可以将鼠标事件重新发送到焦点窗口或给定坐标(xdotool click)的窗口。

您可以使用XBindKeys在某些鼠标或键盘事件上执行脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.