C++을 사용하여 Linux (OpenSuse)에서 Caps Lock, Scroll Lock 및 Num Lock을 켜고 끌 수있는 간단한 방법이 있습니까? 파일을 사용해야합니까? 일부 장치 시뮬레이션 키 입력을 제어하려고합니다. 이 솔루션은 바로 키보드의 주도에 설정 때문에이 솔루션을 참조 funcion 너무 잠 그려면 모자를 활성화해야하는 경우어떻게하면 Caps Lock, Scroll Lock, Num Lock 키를 리눅스에서 프로그래밍 방식으로 켜고 끌 수 있습니까?
답변
솔루션 1
, 머리를 이동하십시오 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 윈도우 시스템 관리자와 함께 작동
솔루션 (리눅스에서 거의 표준이다).
// 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)은 어떻습니까? –
Windows에 아날로그 KDSETLED/KDGETLED가 있습니까? – MaysSpirit
[This (http://stackoverflow.com/questions/2171408/how-to-change-caps-lock-status-without-key-press) 질문은 파이썬에 관한 것이지만 본질적으로 동일합니다. 언어 적으로 다소 차이가 있습니다. 나는 그것이 POSIX인지 또는 다른 유닉스에 의해 지원되는지 전혀 모른다. – Downvoter