【问题标题】:How can I turn on/off Caps Lock, Scroll Lock, Num Lock key programatically on Linux如何在 Linux 上以编程方式打开/关闭 Caps Lock、Scroll Lock、Num Lock 键
【发布时间】:2016-12-18 02:16:03
【问题描述】:

在Linux(OpenSuse)上使用C++打开/关闭Caps Lock、Scroll Lock和Num Lock有没有简单的方法,需要使用哪些头文件? 我想控制一些设备模拟击键。

【问题讨论】:

  • This 问题与 Python 有关,但本质上是相同的,因为该机制或多或少与语言无关。我不知道它是 POSIX 还是其他 Unices 完全支持。

标签: c++ keyboard opensuse capslock


【解决方案1】:

解决方案 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 descriptor\n";
    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

此解决方案适用于 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;
}

注意:更多的关键符号可以在header中找到。

【讨论】:

  • 超级用户特权听起来像 Windows 通常一样愚蠢。与安全性相反,当您必须允许任何事情才能做一些微不足道但至关重要的小事时。是否有可能设计一个守护进程或可以做到这一点并为任何非特权进程提供 API 的东西?
  • windows中是否有模拟KDSETLED/KDGETLED?
  • @MaysSpirit 我认为应该更容易找到 Windows 的解决方案。去 google 看看,否则在 StackOverflow 上开个问题
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 2011-08-17
  • 2013-06-05
  • 2012-02-22
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多