используя GetKeyState(VK_CAPITAL) и 1 в linux

#include <windows.h>

int main() {
if ( !GetKeyState(VK_CAPITAL) & 1 ) {
printf("caps off");
}
else
printf("caps on");
return 0;
}

но ограничено только окнами

как это сделать в линуксе с помощью gcc?

что такое & 1 в GetKeyState(VK_CAPITAL) & 1 ?


person Sunny Sam    schedule 25.01.2012    source источник
comment
& 1 проверяет младший бит, чтобы проверить, переключена ли клавиша, старший бит используется, чтобы проверить, не нажата ли она.   -  person Necrolis    schedule 26.01.2012


Ответы (1)


Для наиболее распространенного случая рабочего стола на базе X11:

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

int main() {
    Display * d = XOpenDisplay((char*)0);

    if (d) {
        unsigned n;

        XkbGetIndicatorState(d, XkbUseCoreKbd, &n);

        printf((n & 1)?"caps on\n":"caps off\n");
    }
}

Убедитесь, что у вас есть заголовки разработки X11, и скомпилируйте их с помощью:

$ gcc -lX11 test.c -o test

Запустите его из окна консоли на рабочем столе:

$ ./test
caps off
$ ./test
caps on
person thkala    schedule 25.01.2012
comment
@SunnySam: этот код должен работать в подавляющем большинстве дистрибутивов Linux, если вы используете графический рабочий стол. - person thkala; 26.01.2012
comment
генерирует много ошибок при компиляции в CentOS 5, уже включенные заголовки разработки x11, что делать? - person Sunny Sam; 26.01.2012
comment
@SunnySam: К сожалению, у меня нет доступа к системе CentOS. Какие ошибки вы получаете? - person thkala; 27.01.2012
comment
не могу распознать XKBlib.h, можете ли вы предоставить мне ссылку на этот заголовочный файл. - person Sunny Sam; 04.02.2012
comment
@SunnySam: Насколько я знаю, этот файл находится в rpm libX11-devel - вы должны иметь возможность использовать yum для его установки ... - person thkala; 04.02.2012
comment
Мы говорим о Centos 5.7, верно? Или вы буквально имеете в виду Centos 5.0? Я могу найти только то, что есть в rpmfind: fr2.rpmfind.net/linux/rpm2html/ - person thkala; 04.02.2012