2016-08-11 4 views
0

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

+0

[This] (http://stackoverflow.com/questions/2171408/how-to-change-caps-lock-status-without-key-press) вопрос касается Python, но по сути тот же, поскольку механизм более или менее не зависит от языка. Я не знаю, является ли это POSIX или поддерживается другими Unices. – Downvoter

ответ

0

Решение 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.

+0

Чувствительность суперпользователя звучит так же глупо, как Windows. Противоположность безопасности, когда вам нужно что-то разрешить, чтобы сделать какую-то тривиальную, но важную вещь. Может ли быть возможно создать процесс демона или что-то, что может это сделать, и предоставить API для любого непривилегированного процесса? –

+0

Как насчет [xdotool] (https://github.com/jordansissel/xdotool)? –

+0

Есть ли аналог KDSETLED/KDGETLED в окнах? – MaysSpirit

Смежные вопросы