2016-08-11 6 views
0

aktivieren Gibt es eine einfache Methode, um Caps Lock, Scroll Lock und Num Lock auf Linux (OpenSuse) mit C++, was Header zu aktivieren/deaktivieren Dateien müssen verwenden? Ich möchte einige Geräte steuern Tastenanschläge simuliert.Wie kann ich Caps Lock, Scroll Lock, Num Lock-Taste programmatisch auf Linux

+0

[Diese] (http://stackoverflow.com/questions/2171408/how-to-change-caps-lock-status-without-key-press) Frage betrifft Python, aber ist im Wesentlichen das gleiche, seit dem Mechanismus ist mehr oder weniger sprachunabhängig. Ich weiß nicht, ob es POSIX ist oder von anderen Unices unterstützt wird. – Downvoter

Antwort

0

Lösung 1

Bitte gehen Kopf, weil diese Lösung auf die LED der Tastatur drehen nur, wenn Sie die Caps Lock funcion aktivieren müssen, siehe Lösung 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; 
} 

Denken Sie daran, Sie müssen Ihr Programm mit Superuser-Rechten starten, um in die Datei /dev/console zu schreiben.


EDIT

Lösung 2

Diese Lösung mit X11-Window-System-Manager arbeitet (unter Linux ist fast ein Standard).

// 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; 
} 

Hinweis: mehr Schlüssel-Symbol in den header finden.

+0

Die Super-User-Privileg-Sache klingt so albern wie Windows oft ist. Das Gegenteil von Sicherheit, wenn man etwas zulassen muss, um etwas Triviales, aber Entscheidendes zu tun. Könnte es möglich sein, einen Daemon-Prozess oder etwas, das dies kann, zu entwerfen und eine API für jeden nicht-privilegierten Prozess bereitzustellen? –

+0

Was ist mit [xdotool] (https://github.com/jordansissel/xdotool)? –

+0

Gibt es eine analoge KDSETLED/KDGETLED in Windows? – MaysSpirit