如何通过命令行关闭Caps Lock(锁定,而不是键)?
出于某种原因,我的笔记本电脑卡在了Caps Lock中。 我有由xmodmap
映射到xmodmap
的Caps Lock键,所以我没有caps_lock
键来关闭它。 有没有办法可以通过命令行关闭它? 如果我能在不重置计算机的情况下重置锁定状态会很好,特别是为了将来的参考。 这种情况以前发生过,但我现在想知道如何正确地做到这一点。
我不知道在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)'
在这里,它再次以更加扩展的forms出现。 我们使用Python ctypes 库直接从X库调用C函数。 函数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))
。 要打开X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16))
上的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-essentials
和libx11-dev
。
#include #include #include 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
重新启用它。
X自动化工具可用于发送所需的键事件。
注意:
如果您的CAPS当前处于活动状态,此解决方案需要您输入正确的密码:打开办公室写入程序,在那里写密码,更改字母大小写,复制它,然后将其粘贴到密码对话框。如果上一步不可行或不起作用,请使用Gilles的answer / python脚本 。 它不需要安装任何其他工具,它只使用预先安装的
python
和libX11
共享库。
使用xdotool
-
安装它
sudo apt-get install xdotool
-
发送CAPS向下/向上事件
xdotool key Caps_Lock
另一个工具是xte
-
安装它
sudo apt-get install xautomation
-
发送CAPS锁定/向上事件
xte "key Caps_Lock"
参考文献:
- Ubuntu论坛:大写锁定倒置
-
man xdotool
-
man xte
至于Gilles python版本不适用于较新的ubuntus,为开放式显示设置正确的返回似乎可以解决问题:
#! /usr/bin/env python from ctypes import * import subprocess 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 )
如果您无法访问CAPS,因为您在.bashrc中重新映射它,就像我一样,然后只需切换到虚拟终端(alt + ctl + fN),然后切换回来为我工作。