键盘鼠标模拟工具xdotool

很多时候需要完成一些重复性的工作,可是用程序实现又非常困难。如在浏览器中实现抢红包,或者实现游戏中组合键连击,或者实现一键窗口平铺之类的工作。对于windows下有种工具叫作“按键精灵”,能实现按键的自动组合。而Linux下则有工具xdotool,能模拟击键和鼠标的移动,实现一些“看起来很简单”,但是用程序实现非常难的操作。
安装方法就不多说了,一般情况下可以直接在源里面找到,直接安装即可。下面简单的说一说使用方法。

一、 键盘操作

首先得说明了xdotool是一个基本语法规则为:

$ xdotool cmd args

其中cmd指的是xdotool的命令,而args则是cmd的参数。和键盘操作相关的主要有:

key     常规按键(按下再松开整个过程)
keydown 按下按键
keyup   松开按键
type    直接模拟输入内容

这些命令后面可直接接上按键表,如:

$ xdotool key F1 a ctrl+l

则表明依次模拟按下了F1,a和Contrl+L键。注意xdotool的命令可以连续使用,如:

$ xdotool key F1 keydown a keydown b keyup a keyup b

则表明按下F1,然后按住a不放,再按住b不放,再放了a,再放了b。有些时候需要对按键的时候进行控制,如果按住a按下1s之后再按下b,过了0.5秒后再放了a,则可以这样:

$ xdotool keydown --delay 1000 a key --delay 500 b keyup a

其中–delay表示为两次按键命令之间的时间间隔,单位为ms。和一般参数不同的是,cmd的参数一定要直接位于其后,否则就没有办法识别。

如果想要知道所有按键对应的名称,可以使用1

$ xmodmap -pke

查找键盘映射表。

二、鼠标操作

鼠标操作和键盘操作的方式是完全相同的,基本的操作有:

mousemove 将光标移动指定的位置(左上角为(0,0),向下向右为正)
mousemove_relative 移动光标到指定位置(采用的是相对位置)
click 单击一下鼠标上的按钮
mousedown 按住鼠标上的按钮
mouseup   松开鼠标上的按钮
getmouselocation 获得鼠标所在位置的信息(坐标,窗口ID)

其中mousemove可接受的参数类型有两种,一种是(x,y)的坐标形式,或者是’restore’,表示将光标回归原位,如:

$ xdotool mousemove 100 100 key a mousemove restore

表示移动鼠标到(100,100)的位置,然后按下按键a,再将光标恢复到原来位置。而click则表示可以操作的按钮。其中

1       代表左键
2       代表中键
3       代表右键
4       代表滑轮上移
5       代表滑轮下移

而click比较重要参数除了delay之后,还有repeat,表明按键重复按了多少次。如双击左键即可写为:

$ xdotool click --repeat 2 1

三、窗口操作

在界面上进行操作,自然离不开窗口和桌面,而键盘和鼠标的操作基本均是对相应的操口才会生效。所以窗口操作起着定向的作用。一般来说,窗口拥的属性有:

1. 窗口左上角的坐标(x,y)
2. 窗口的宽高(width,height)
3. 窗口的名称、class名称,ID

其中PID具有唯一性,但是却不容易直接看到,而name则是最容易看到的内容(一般位于窗口的标题栏上)。窗口的操作比较多,但是其中最为有用是有:

search 根据一定条件,用正则表达式搜索窗口,返回匹配的列表。
windowmove 移动窗口
getwindowpid 获取指定window的PID
getwindowgeometry 获取指定window的物理位置

由于窗口操作相对较多,本文不再详细说明,如果想要获得更多的帮内容,可以参考xdotool的man手册,写得相当的详细,举例也较多。

四、使用范例

4.1 用鼠标移动窗口

xdotool提供了直接移动窗口的方法,不过同样也可以使用鼠标来模拟人的手动操作来实现移动窗口。

#获取含有MAME的window的ID
$ WID=`xdotool search --name "MAME"`
#将光标移动到该窗口的左上角(窗口大小不包含标题栏的)
$ xdotool mousemove --window ${WID} 0 0
#将光标移动到该窗口作标题栏的位置,采用相对位置的计算方法,要注意,如果使用负值
#那需要加--,而正值则不需要
$ xdotool mousemove_relative -- 30 -5
#移动窗口到指定坐标
$ xdotool mousedown 1 mousemove 500 500 mouseup 1

4.2 自动搜索

假设Bing积分可以兑取亚马逊的礼物卡和其它的一些礼物卡,而要赚取这些积分,你需要每天在Bing上搜索累计达30次。现在为了完成任务,你可使用xdotool来实现自动搜索,脚本代码如何2:

#!/bin/bash
for i in{1..30}
do
    #完成firefox浏览器的自动聚焦
    WID=`xdotool search --title "Mozilla Firefox" | head -1`
    xdotool windowfocus $WID
    #进入搜索框
    xdotool key ctrl+l
    xdotool key Tab
    #开始打字并完成搜索
    SENTENCE="$(fortune | cut -d' ' -f1-3 | head -1)"
    xdotool type $SENTENCE
    xdotool key "Return"
    sleep 4
done

五、小结

xdotool本是我想着如何简化游戏的操作的工具,但是实际功用还是比较强大的,能够实现程序本身无法实现的功能。这个工具比较起另外一个窗口操作工具wmctrl要强大的多(wmctrl主要作用是移动窗口和改变窗口的属性),可以与Linux其它的工具以配合,从而实现较好的自动化效果。

Reference


  1. archlinux_wiki.Xmodmap.https://wiki.archlinux.org/index.php/Xmodmap_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 
  2. Linux.Linux中安装xdotool模拟击键和鼠标移动.2014/08/31.Linux中国.http://www.linuxidc.com/Linux/2014-08/105996.htm 
此条目发表在LINUX分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。