Как получить состояние num-блокировки, используя C / C ++? - PullRequest
3 голосов
/ 08 декабря 2011

Я прочитал ссылку на форум Gdk, в которой говорится, что получение API состояния num lock реализовано начиная с версии 3.0. Но я использую версию 2.4, и я не могу обновиться до версии 3.0, так как мне нужно поддерживать более низкую версию Linux. Вот ссылка на обсуждение:

http://mail.gnome.org/archives/commits-list/2010-July/msg00259.html

ТАК, есть ли другой способ получить состояние блокировки num с помощью внутренней команды Linux?

С уважением, ISight

Ответы [ 5 ]

5 голосов
/ 08 декабря 2011

Пример кода для получения состояния NumLock.Пусть foo.c будет:

#include <stdio.h>
#include <X11/Xlib.h>

int main(void) {  
   Display *dpy = XOpenDisplay(":0"); 
   XKeyboardState x;
   XGetKeyboardControl(dpy, &x);
   XCloseDisplay(dpy);
   printf("led_mask=%lx\n", x.led_mask);
   printf("NumLock is %s\n", (x.led_mask & 2) ? "On" : "Off");
   return 0;
}

Тогда получится, протестировано с CentOS 5 на ноутбуке Dell:

gcc foo.c -o foo -lX11
foo
led_mask=2
NumLock is On

Или вы можете сделать что-то с popen("xset q | grep LED");.

Второй бит маски довольно распространен для NumLock, но я не верю, что он гарантирован.

Оригинальный ответ: Хорошая отправная точка - xev, доступнов течение примерно 20 лет:

   xev

И вы можете декодировать ключевые события с помощью:

foobar (XKeyEvent *bar) {
   char dummy[20];
   KeySym key;
   KeySym keyKeypad;
   XLookupString(bar, dummy, sizeof dummy, &key, 0);
   keyKeypad = XKeycodeToKeysym(..., bar->keycode, NUMLOCK_Mask);
   if (IsKeypadKey(keyKeypad))
      ...;
   // ...
}
1 голос
/ 25 ноября 2017

Если вас не волнует состояние Numlock «пока ничего не происходит», и только когда, например, происходит нажатие клавиши, самый низкий способ накладных расходов это:

Для некоторых XKeyEvent *xke

bool numlock = ((xke->state & Mod2Mask) == Mod2Mask);

Для GDK вам может понадобиться что-то вроде Gdk.FilterFunc , чтобы получить xevent.Чек xevent->type.

#include <Xlib.h>
XEvent = (XEvent *) &xevent // from Gdk.FilterFunc
int type = event ->type;
switch(type) {
    case KeyPress:
    case KeyRelease:
        do_something_with((XKeyEvent *) event);
        break;
}
0 голосов
/ 13 декабря 2011

Я проверил код ключа аппаратного обеспечения.Всякий раз, когда включена цифровая блокировка и нажата цифровая клавиша на цифровой клавиатуре, я сравниваю код аппаратной клавиши, который универсален для всех производителей.Следовательно, мне не нужно использовать заголовок ioctl.h.

0 голосов
/ 08 декабря 2011

Я немного понюхал и нашел возможную реализацию с ioctl.h, которая опрашивает состояние клавиатуры и проверяет его на наличие пары флагов.

Взгляните на реализацию этой формы и замените K_CAPSLOCK на K_NUMLOCK*. Это довольно бесполезно, но его легко обернуть в функцию и спрятать.

* Причина замены на посту была из-за старой ошибки, когда блокировка заглавных букв и блокировка номеров были случайно изменены. Это должно быть исправлено сейчас .

0 голосов
/ 08 декабря 2011

Вы можете использовать эту команду linux для этого

{if (num_lock == 0) system ("setleds -F + num");иначе, если num_lock == 1);// ничего не делать}

...