在 Linux 中使用键作为鼠标按钮。AHK(AutoHotkey)的替代品?

在 Linux 中使用键作为鼠标按钮。AHK(AutoHotkey)的替代品?

在 Windows 中我有一个 AutoHotkey 脚本,它:

  • 仅在大写锁定打开时有效
  • 当按下左控制键、菜单键和 Alt 键时生成鼠标左键、中键和右键事件
  • 允许按住按键(用于拖动对象)

有没有简单的方法可以在 Linux 中复制此功能?

答案1

键盘映射 - 鼠标单击 - 中键单击 如何将鼠标按钮映射到键盘按键

首先,禁用键盘控制鼠标,以便 xev 可以捕获键码,然后输入命令:

$ xev

然后将鼠标移到弹出的小窗口中。按下鼠标按钮以找出该按钮的名称:见下文,我发现我的鼠标按钮之一被称为“按钮 1”

ButtonPress event, serial 37, synthetic NO, window 0x6200001,
    root 0x29d, subw 0x6200002, time 2427401, (31,41), root:(652,407),
    state 0x0, button 1, same_screen YES

然后找出您想要将该鼠标按钮映射到哪个键盘键:按下键盘键并找到键码。

当我按下键盘上的空格键时,终端显示:

KeyPress event, serial 37, synthetic NO, window 0x6200001,
    root 0x29d, subw 0x0, time 2152399, (398,60), root:(1019,426),
    state 0x0, keycode 65 (keysym 0x20, space), same_screen YES,
    XLookupString gives 1 bytes: (20) " "
    XmbLookupString gives 1 bytes: (20) " "
    XFilterEvent returns: False

从上面我们发现 Space 键的键码是 65 所以您需要找到要将鼠标按钮映射到的键的键码...

然后下一步:

$ sudo apt-get install xkbset

然后复制下面的脚本并将其保存到名为 keymap_mouse2kb.sh 的文件中

当然,将键盘键码更改为您想要的键码

#!/bin/bash
# set XKB layout
setxkbmap -layout us
# turn on mousekeys
xkbset m
# stop mousekeys expiring after a timeout
xkbset exp =m
# map keysym to other keysym
#xmodmap -e "keysym Menu = Pointer_Button2"
# this also works
 xmodmap -e "keycode 66 = Pointer_Button2"
 xmodmap -e "keycode 133 = Pointer_Button1"
 xmodmap -e "keycode 88 = Pointer_Button3"

然后使该文件可执行

$ sudo chmod u+x keymap_mouse2kb.sh

然后在需要时运行它...例如在启动时

$ ./keymap_mouse2kb.sh

答案2

X 具有内置机制,可使用键盘控制鼠标光标。按下 Pointer_EnableKeys键可激活此模式(鼠标键模式);它通常与Shift+绑定NumLock

在鼠标键模式下,键盘箭头移动指针,其他键盘键模拟按钮(/*-分别为左键、中键、右键;+左键双击,和0左键.按下并释放)。

鼠标键了解更多信息。顺便说一下,此模式可以在视窗也。

答案3

我也有类似的需求。我找不到任何现有的解决方案来满足我的所有需求,所以我编写了一个小实用程序来实现它并将其放在 GitHub 上。

https://github.com/SalmonChris/KeyboardMouse

答案4

使用“xkbset m”会导致禁用数字键盘,因此我不得不寻找其他解决方案。这是我最终得到的解决方案:

创建 /usr/local/bin/click 并包含以下内容:

#!/bin/bash

# This script can be used to simulate mouse click and drag'n'drop with keyboard key.
# click 1 - left mouse button (the default if no arguments provided)
# click 2 - middle mouse button
# click 3 - right mouse button
# click 2 Shift_L - Press Shift key with middle mouse button (you can use any other
# modifier key instead)
#
# IMPORTANT: Do not forget to find your keyboard device name with "xinput list" command
# and change XINPUT_DEVICE below. Use "xinput test 'your keyboard name'" to be sure
# that you found correct device name.

(
  XINPUT_DEVICE="TypeMatrix.com USB Keyboard"
  if [[ -z "$1" ]]; then set -- "1"; fi
  if [[ -n "$2" ]]; then xdotool keydown --clearmodifiers "$2"; fi
  xdotool mousedown $1
  while read event; do
    if [[ $event == *release* ]]; then
      xdotool mouseup $1
      if [[ -n "$2" ]]; then xdotool keyup "$2"; fi
      break; fi; done < <(xinput test "$XINPUT_DEVICE")
)&

使其可执行:

chmod +x /usr/local/bin/click

然后它可以用作键盘快捷键启动的命令。例如,在 KDE 中,我为鼠标中键创建了自定义快捷方式,使用菜单键作为触发器,并使用作为操作click 2。如果您使用不同的桌面环境或 xbindkeys,过程几乎相同,只需使用您想要的任何键作为快捷键并使其运行click命令即可。

为了使 Shift+鼠标中键起作用,我必须为 Shift+菜单键创建单独的快捷方式,并将命令指定click 2 Shift_L为操作。

如果您想知道为什么要使用这个复杂的脚本而不是xdotool click,原因是使用xdotool click无法通过按住键进行拖放(这对于鼠标中键也很重要,许多应用程序使用它来旋转或平移视图)。上面的脚本使这成为可能。

相关内容