让鼠标保持在圆圈内

让鼠标保持在圆圈内

这是一个有点随机的问题。我希望能够让鼠标在一段时间内保持在一个圆圈(或正方形)内。

澄清一下,我希望鼠标能够像在边框屏幕内较小的屏幕中一样操作。它仍将由用户操作,但不会移出较小的区域。它仍将能够与其下方的激活应用程序进行交互。它只是无法移出小区域。

例如:

  1. 使用命令设置终端来运行脚本或其他东西
  2. 将鼠标移动到特定位置
  3. 按 Enter 键运行终端命令
  4. 现在鼠标只能在它所在点的特定半径内移动
  5. 为了停止这种行为,我想我必须右键单击鼠标或双击,或者键盘移动到终端并运行其他程序。

这可以用 xdotool 或者类似的东西来完成吗?

答案1

对于使用 Wayland 的用户,出于安全考虑,Wayland 的设计明确排除了这种虚假输入。请参阅@grawity 的回答xorg 的 xdotool 的 Wayland 替代品进行相关问题的讨论。

下面的脚本演示了如何将鼠标限制在脚本启动时所在的窗口。更改命令中的测试while以测试任务是否已完成将显著改善脚本。取消注释 sleep 命令将允许任务作为技能测试/谜题位于原始窗口之外。

#!/bin/bash
###
#a script to demonstrate using xdotool to restrict mouse movement to a single window. Inspired by a script posted by pfanne on LinuxQuestions.org

###

            #original mouselocation
            POS=$(xdotool getmouselocation | sed 's/:/ /g')
            WINDOW=$(echo $POS | cut -d' ' -f8)
            XPOS=$(echo $POS | cut -d' ' -f2)
            YPOS=$(echo $POS | cut -d' ' -f4)
while [ true ]
do
    if [ $WINDOW != $(xdotool getmouselocation | sed 's/:/ /g' | cut -d' ' -f8 ) ];
        then
            xdotool mousemove $XPOS $YPOS;
            #sleep 1
    fi
done

pfanne 编写的这个脚本演示了如何使用任意矩形来约束鼠标的位置。

#!/bin/bash

borderxl=$1
borderyu=$2

borderxr=$3
borderyd=$4

check=0

if [ $borderxl -gt $borderxr ]
then
        check=1
fi

if [ $borderyu -gt $borderyd ]
then
        check=1
fi
if [ $check -ge "1" ]
then
        echo "Make sure the first coordinate pair refers to the upper left corner"
        echo "and the second pair refers to the lower right one."
fi

if [ $check -lt "1" ]
then
        while [ true ]
    do
            check=0
            declare -a pos
            pos=$(xdotool getmouselocation)
            #xpos=`xdotool getmouselocation | awk '{ print $1}'`
            #xpos=${xpos:2}
            #xpos=`getcurpos | awk '{ print $1}'`
            #ypos=`xdotool getmouselocation | awk '{ print $2}'`
            #ypos=${ypos:2}
            #ypos=`getcurpos | awk '{ print $2}'`

            if [ $xpos -gt $borderxr ]
            then
                    check=1
                    xpos=$borderxr
            fi

            if [ $ypos -gt $borderyd ]
            then
                    check=1
                    ypos=$borderyd
            fi

            if [ $xpos -lt $borderxl ]
            then
                    check=1
                    xpos=$borderxl
            fi

            if [ $ypos -lt $borderyu ]
            then
                    check=1
                    ypos=$borderyu
            fi


            if [ $check -ge "1" ]
            then
                    xdotool mousemove $xpos $ypos
            fi
    done   
fi

相关内容