Есть ли простой способ включения/выключения Caps Lock, Scroll Lock и Num Lock в Linux (OpenSuse) с использованием C++, какой заголовок файлы нужно использовать? Я хочу управлять некоторым устройством, имитируя нажатия клавиш.Как я могу включить/выключить Caps Lock, Scroll Lock, Num Lock key программно на Linux
ответ
Решение 1
Перейди голову, потому что это решение просто включить светодиод клавиатуры, если вам нужно включить Caps Lock несильно тоже см Раствора 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
.
EDIT
Решение 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 для любого непривилегированного процесса? –
Как насчет [xdotool] (https://github.com/jordansissel/xdotool)? –
Есть ли аналог KDSETLED/KDGETLED в окнах? – MaysSpirit
[This] (http://stackoverflow.com/questions/2171408/how-to-change-caps-lock-status-without-key-press) вопрос касается Python, но по сути тот же, поскольку механизм более или менее не зависит от языка. Я не знаю, является ли это POSIX или поддерживается другими Unices. – Downvoter