如何在Linux上以编程方式打开/关闭Caps Lock, Scroll Lock, Num Lock键



是否有一个简单的方法来打开/关闭大写锁,滚动锁和Num锁在Linux (OpenSuse)使用c++,什么头文件需要使用?我想控制一些设备模拟按键

解决方案1

请继续,因为这个解决方案只是打开键盘的led,如果你需要启用大写锁定功能,参见解决方案2。

// Linux header, no portable source
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
  int fd_console = open("/dev/console", O_WRONLY);
  if (fd_console == -1) {
    std::cerr << "Error opening console file descriptorn";
    exit(-1);
  }
  
  // turn on caps lock
  ioctl(fd_console, 0x4B32, 0x04);
  // turn on num block 
  ioctl(fd_console, 0x4B32, 0x02);
  
  // turn off 
  ioctl(fd_console, 0x4B32, 0x0);
  
  close(fd_console);
  return 0;
}

请记住,您必须以超级用户权限启动您的程序,以便在文件/dev/console中写入。


<标题>编辑<标题>解决方案2 h1> 解决方案适用于X11窗口系统管理器(在linux上几乎是一个标准)。
// X11 library and testing extensions
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
int main(int argc, char *argv[]) {
  // Get the root display.
  Display* display = XOpenDisplay(NULL);
  
  // Get the keycode for XK_Caps_Lock keysymbol
  unsigned int keycode = XKeysymToKeycode(display, XK_Caps_Lock);
  
  // Simulate Press
  XTestFakeKeyEvent(display, keycode, True, CurrentTime);
  XFlush(display);
  
  // Simulate Release
  XTestFakeKeyEvent(display, keycode, False, CurrentTime);
  XFlush(display);
 
  return 0;
}

注意:更多的key-symbol可以在header中找到。

最新更新