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

出于某种原因,我的笔记本电脑卡在了Caps Lock中。 我有由xmodmap映射到xmodmapCaps Lock键,所以我没有caps_lock键来关闭它。 有没有办法可以通过命令行关闭它? 如果我能在不重置计算机的情况下重置锁定状态会很好,特别是为了将来的参考。 这种情况以前发生过,但我现在想知道如何正确地做到这一点。

我不知道在Ubuntu中有任何命令行工具。 (对于Num Lock,有numlockx 安装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-essentialslibx11-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脚本 。 它不需要安装任何其他工具,它只使用预先安装的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" 

参考文献:

  • 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),然后切换回来为我工作。