Как программно включить / выключить Caps Lock, Scroll Lock, Num Lock в Linux

Есть ли простой способ включить / выключить Caps Lock, Scroll Lock и Num Lock в Linux (OpenSuse) с помощью C ++, какие заголовочные файлы нужно использовать?
Я хочу, чтобы некоторые устройства имитировали нажатия клавиш.

0

Решение

Пожалуйста, идите головой, потому что это решение просто включите светодиод клавиатуры, если вам нужно включить заглушки функция тоже, см. решение 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,


Это решение работает с оконным системным менеджером 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;
}

Примечание: больше ключа-символа можно найти в заголовок.

0

Другие решения

Других решений пока нет …