如何通过命令行关闭 Caps Lock(锁,而不是钥匙)?

如何通过命令行关闭 Caps Lock(锁,而不是钥匙)?

由于某种原因,我的笔记本电脑卡在 Caps Lock 中。我已将该Caps Lock键映射xmodmaphyper_l,因此我没有键caps_lock可以将其关闭。有没有办法通过命令行将其关闭?如果我可以在不重置计算机的情况下重置锁定状态,那就太好了,尤其是为了将来参考。以前发生过这种情况,但我现在想知道这次如何正确执行。

答案1

我不知道 Ubuntu 中是否有任何命令行工具可以实现这一点。(对于 Num Lock,数字锁定 安装 numlockx)这里有一行代码,你可以复制粘贴到终端窗口中:

python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'

这里再次以更扩展的形式展示。我们使用Python ctypes 库从调用 C 函数X 库直接。函数XkbLockModifiers改变核心键盘(XkbUseCoreKbd= 0x0100)上键盘锁的状态,影响 Caps Lock(2),将其设置为 0(关闭)。

#!/usr/bin/env python
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

如果您有卡住的修饰键,请将 2 更改为要关闭的修饰键的掩码。修饰键为 1=Shift、2=Lock(Caps Lock)、4=Control、8=Mod1、16=Mod2、32=Mod3、64=Mod4、128=Mod5。运行xmodmap -pm以查看 Mod1 到 Mod5 对应的内容。例如,要关闭所有修饰键,请调用X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0))。要打开 Mod2 上的 Num Lock 并同时关闭 Caps Lock,请调用X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16))


如果您想制作一个小型二进制文件而不是调用 Python,这里有一个 C 版本。使用 进行编译,并安装gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11软件包和。build-essentialslibx11-dev

#include <stdio.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
int main()
{
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "Couldn't open display\n");
        return 2;
    }
    Bool sent = XkbLockModifiers(display, XkbUseCoreKbd, LockMask, 0);
    if (!sent) {
        fprintf(stderr, "Couldn't send LatchLockState\n");
        return 1;
    }
#ifdef REPORT_STATE
    XkbStateRec xkb_state;
    Status status = XkbGetState(display, XkbUseCoreKbd, &xkb_state);
    if (status) {
        fprintf(stderr, "XkbGetState returned %d\n", status);
        return 1;
    }
    printf("state.group=%02x\n", xkb_state.group);
    printf("state.locked_group=%02x\n", xkb_state.locked_group);
    printf("state.base_group=%02x\n", xkb_state.base_group);
    printf("state.latched_group=%02x\n", xkb_state.latched_group);
    printf("state.mods=%02x\n", xkb_state.mods);
    printf("state.base_mods=%02x\n", xkb_state.base_mods);
    printf("state.latched_mods=%02x\n", xkb_state.latched_mods);
    printf("state.locked_mods=%02x\n", xkb_state.locked_mods);
    printf("state.compat_state=%02x\n", xkb_state.compat_state);
    printf("state.grab_mods=%02x\n", xkb_state.grab_mods);
    printf("state.compat_grab_mods=%02x\n", xkb_state.compat_grab_mods);
    printf("state.lookup_mods=%02x\n", xkb_state.lookup_mods);
    printf("state.compat_lookup_mods=%02x\n", xkb_state.compat_lookup_mods);
    printf("state.ptr_buttons=%02x\n", xkb_state.ptr_buttons);
#endif
    int err = XCloseDisplay(display);
    if (err) {
        fprintf(stderr, "XCloseDisplay returned %d\n", err);
        return 1;
    }
    return 0;
}

另外可能感兴趣的是暂时忽略 Caps Lock 的方法:

xkbset nullify lock

此后,Caps Lock 将永久关闭,直到您使用 重新启用它xkbset nullify -lock

答案2

使用 Xorg 自动化

Xorg 自动化工具可用于发送所需的按键事件。

笔记:

首次使用时,如果您的 CAPS 当前处于活动状态,此解决方案需要您输入正确的密码来安装新工具:

  • 使用SHIFT键输入小写字母。
  • 启用辅助功能,覆盖虚拟键盘。
  • 重新插入外接键盘。(感谢克里斯455
  • 打开 Office Writer,在那里输入密码,更改字母大小写,复制,然后将其粘贴到密码对话框中。

如果所有先前的选项都不可行或不起作用,则选择Gilles 的回答/python 脚本。它不需要安装任何额外的工具,它只使用预先安装的共享库pythonlibX11

使用xdotool

  1. 安装

    sudo apt-get install xdotool
    
  2. 发送 CAPS 向下/向上事件

    xdotool key Caps_Lock
    

另一个工具是xte

  1. 安装

    sudo apt-get install xautomation
    
  2. 发送 CAPS 锁定向下/向上事件

    xte "key Caps_Lock"
    

参考:

答案3

至于 Gilles 的 Python 版本无法在较新的 Ubuntu 上运行,为打开的显示设置正确的返回似乎可以解决问题:

#!/usr/bin/env python

from ctypes import *

class Display(Structure):
    """ opaque struct """

X11 = cdll.LoadLibrary("libX11.so.6")
X11.XOpenDisplay.restype = POINTER(Display)

display = X11.XOpenDisplay(c_int(0))
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

(代码改编自https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress

答案4

我遇到了这个问题,并能够通过使用 OnBoard 键盘(在 Ubuntu Mate 中,在 Universal Access 下)解决它。

开启后,您应该会看到 CapsLock 键呈红色,或者以某种方式指示它已锁定。然后您可以按下以关闭。

相关内容