Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/181: Рейтинг темы: голосов - 181, средняя оценка - 4.66
1 / 1 / 0
Регистрация: 31.03.2012
Сообщений: 93
1

Перехват нажатия клавиши на Linux

26.04.2012, 16:15. Показов 33719. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые эксперты! С помощью WinApi функций было просто использовать функцию GetAsyncKeyState. При нажатии на какую-либо кнопку выполнялось какое-либо действие.
C++
1
if(GetAsyncKeyState(VK_Shift) {....}
Это помогает программе быть многофункциональной(3 в 1)
так вот. Каким образом совершить подобное на Linux?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2012, 16:15
Ответы с готовыми решениями:

Перехват нажатия клавиш XGrabKeyboard
Нашёл готовое решение, немного допилил и получился вот такой говнокод: #include <X11/Xlib.h>...

Получение нажатия клавиши из неактивного окна
Привет всем! Как можно получить нажатую клавишу, если окно приложения не активно?

Скомпилированная программа закрывается после нажатия клавиши
В общем такая проблема, написал прогу на c++ , скомпилировал, у меня всё работает...

Отлов нажатия клавиатуры в Linux
Здравствуйте, может кто то подсказать как сделать глобальный отлов нажатия клавиш клавиатуры? В...

32
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
08.05.2012, 22:07 21
Author24 — интернет-сервис помощи студентам
shooter9688, ну вот - ты туда можешь по идее прописать цифры 258, 259, 260, 261, либо понятные макросы объявить типа вверх,вниз,вправо,влево (чтобы было понятно что это).
сюда:
Цитата Сообщение от shooter9688 Посмотреть сообщение
switch(key) { case 119: motion('u'); case 115: motion('d'); case 97: motion('l'); case 100: motion('r'); }
хотел заметить - у тебя нерациональный код: терминал переключается туда-сюда каждую итерацию. по идее перед циклом включи, а после цикла верни обратно - либо прямо в мейне, либо выведи в функции допустим make_canon_on и make_canon_off ну или как-нибудь еще по вкусу.

Добавлено через 2 минуты
Цитата Сообщение от shooter9688 Посмотреть сообщение
while(game=true);
ошибка. должно быть while(game == true);
1
2 / 2 / 0
Регистрация: 27.04.2012
Сообщений: 30
09.05.2012, 23:09 22
Спасибо!
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
30.01.2016, 18:15 23
Вы извините меня, конечно, но решение Перехват нажатия клавиши на Linux
можно назвать таковым с большой натяжкой. Это просто обработка нажатия клавиши определённым образом, а не его перехват. Перехват, это когда у тебя активно окно, допустим, текстового редактора и рядом неактивное окно консоли. Ты жмёшь на клавишу и срабатывает перехватчик- код клавиши появляется в окне консоли. А-ля хук, только в линукске За сим считаю вопрос нерешённым и возобновляю тему, дабы не создавать новой с таким же в точности названием.

Вопрос открыт.
1
5 / 5 / 2
Регистрация: 05.02.2013
Сообщений: 98
01.02.2016, 14:26 24
Тоже думал над этим. Клавиатура ведь устройство. А значит есть ее файл устройства (драйвер). Я его нашел и при его кате происходит интересная вещь: так как это символьное устройство то при любом нажатии на клавиатуру нам будет в консоль выплевываться куски текста (закодированного ну странного текста). Можно сопоставить этим кускам текста нажатые клавиши и все готово. Но проблема в том что нужен рут. Еще интересно по катить драйвер мыши. Там при любом ее движении будут выходить куски текста.
1
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 16:14 25
Вы извините меня, конечно, но решение Перехват нажатия клавиши на Linux
можно назвать таковым с большой натяжкой. Это просто обработка нажатия клавиши определённым образом, а не его перехват. Перехват, это когда у тебя активно окно, допустим, текстового редактора и рядом неактивное окно консоли. Ты жмёшь на клавишу и срабатывает перехватчик- код клавиши появляется в окне консоли. А-ля хук, только в линукске За сим считаю вопрос нерешённым и возобновляю тему, дабы не создавать новой с таким же в точности названием.
Глупость какая...
В UNIX ещё году в 1970 (лет за 20-25 до появлеия всяких виндаузов) была развита архитектура терминальной подсистемы UNIX. В частности, были определены режимы ввода: канонический + некононический.

А вы пытаетесь притянуть виндаунные стереотипы к совершенно другой архитектуре.
Вы можете в UNIX/Linux произвольно и тонко управлять всеми деталями ввода: эхо-отображение символов или нет, тайм-аут ожидания и мн. др.
Вы можете выполнять это в отдельном потоке или в отдельном окне ... где угодно - только это уже к собственно вводу не имеет никакого касательства.

P.S. Кому интересно, можете посмотреть примеры кода Разработка программных проектов в Linux.
И кстати ... всё, касающееся терминального ввода UNIX, нужно смотреть в коде C, а в C++ оно просто естественно мигрировало, как в наследника ... поскольку код C++ в Linux не может даже выполняться без наличия библиотеки C API libc.so ... что для некоторых является большим сюрпризом.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.02.2016, 16:22 26
Цитата Сообщение от Olej Посмотреть сообщение
А вы пытаетесь притянуть виндаунные стереотипы к совершенно другой архитектуре.
я пытаюсь просто сказать, что вопрос-то не решён. Не пиши больше, тролль. Вопрос открыт.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 16:43 27
я пытаюсь просто сказать, что вопрос-то не решён. Не пиши больше, тролль. Вопрос открыт.
Вопрос более чем решён.
Читай Букварь.
Букварь называется: POSIX.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.02.2016, 17:14 28
Вы заметили, друзья, как он переходит на термины, когда нечего сказать? Канноический- неканонический, ещё какую-то херь несёт...

Цитата Сообщение от Olej Посмотреть сообщение
Вы можете в UNIX/Linux произвольно и тонко управлять всеми деталями ввода: эхо-отображение символов или нет, тайм-аут ожидания и мн. др.
Вы можете выполнять это в отдельном потоке или в отдельном окне ... где угодно - только это уже к собственно вводу не имеет никакого касательства.
а ведь и надо-то всего как перехватить нажатие клавиши. POSIX, ага... Узнаю почерк! Вопрос открыт
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 18:23 29
Цитата Сообщение от kravam Посмотреть сообщение
Вы заметили, друзья, как он переходит на термины, когда нечего сказать? Канноический- неканонический, ещё какую-то херь несёт...
Друг мой, канонический, неканонический терминальный ввод - это терминология из документации Linux/POSIX/UNIX ... в раздел форума по программированию для которых вы, по глупости, заползли.
Это всё (и как это использовать) очень внятно растолковано вот в том Букваре, в который я вам советовал заглянуть ... а вы упираетесь, глупышка
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.02.2016, 19:44 30
Термины посмотреть нетрудно. Я что, нажатия клавиш перехватывать этим научусь? Нет. А ты сам не знаешь как это сделать.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
05.02.2016, 20:26 31
Цитата Сообщение от kravam Посмотреть сообщение
Термины посмотреть нетрудно.
"Учиться, учиться и ещё раз учиться" (с) В.И.Ленин

Цитата Сообщение от kravam Посмотреть сообщение
Я что, нажатия клавиш перехватывать этим научусь? Нет.
Если долго стараться ... долго наживать клавиши и репетировать - обязательно научишься ... ну, если не совсем уж тупой от природы.

Цитата Сообщение от kravam Посмотреть сообщение
А ты сам не знаешь как это сделать.
Я - всё знаю.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
05.02.2016, 23:33 32
Цитата Сообщение от kravam Посмотреть сообщение
Ты жмёшь на клавишу и срабатывает перехватчик- код клавиши появляется в окне консоли.
Пойдет?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <X11/Xlib.h>
#include <X11/Xutil.h>
 
#include <cstdio>
 
int grabKey(Display * display, Window window, KeyCode keycode)
{
    // numlock on
    unsigned int modifiers = Mod2Mask;
    Bool ownerEvents  = True;
    int  pointerMode  = GrabModeAsync;
    int  keyboardMode = GrabModeAsync;
 
    XGrabKey(display, keycode, modifiers, window, ownerEvents, pointerMode, keyboardMode);
    return keycode;
}
 
void ungrabKey(Display * display, Window window, KeyCode keycode)
{
    // numlock on
    unsigned int modifiers = Mod2Mask;
 
    XUngrabKey(display, keycode, modifiers, window);
}
 
int main()
{
    Display* display = XOpenDisplay(0);
    Window   root    = DefaultRootWindow(display);
    XEvent   event;
 
    KeyCode keyA = XKeysymToKeycode(display, 'a');
    KeyCode keyB = XKeysymToKeycode(display, 's');
    KeyCode keyC = XKeysymToKeycode(display, 'd');
    KeyCode keyX = XKeysymToKeycode(display, 'x');
 
    grabKey(display, root, keyA);
    grabKey(display, root, keyB);
    grabKey(display, root, keyC);
    grabKey(display, root, keyX);
 
    XSelectInput(display, root, KeyPressMask);
 
    while(true)
    {
        XNextEvent(display, &event);
        if(event.type == KeyPress)
        {
            std::printf("key pressed: %d\n", event.xkey.keycode);
 
            if(event.xkey.keycode == keyX)
            {
                break;
            }
        }
    }
 
    ungrabKey(display, root, keyX);
    ungrabKey(display, root, keyC);
    ungrabKey(display, root, keyB);
    ungrabKey(display, root, keyA);
 
    XCloseDisplay(display);
}
Линковать с -lX11
1
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 6
12.07.2017, 08:16 33
Пойдет?
Здравствуйте, Спасибо за код, локально он отлично работает (DISPLAY=0), но не удается заставить его работать на удаленном сервере с centos7, к которому я подключаюсь по VNС, DISPLAY я передаю параметром (":6066", например. без двоеточия display=NULL и не работает) и бинарник висит, но не блокирует клавиши, которые я "граблю".
gdb/strace не помогают понять в чём затык.
вывод strace:
Код
Process 2341 attached
restart_syscall(<... resuming interrupted call ...>
Буду благодарен, если подскажете что я делаю не так.

Добавлено через 20 часов 3 минуты
Если быть точным, на сервере запущен Xvnc, в стартовом скрипте которого вызывается браузер, в котором надо блокировать некоторые клавиши (к сожалению, неблокируемые через xmodmap).
0
12.07.2017, 08:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2017, 08:16
Помогаю со студенческими работами здесь

Перехват нажатия клавиши
Добрый день! Столкнулся с такой проблемой: требуется прервать работу скрипта в произвольный...

Перехват нажатия клавиши
в винде клавиши перехватывабтся с помощью винапи registerhotkey. но как сделать чтобы...

Перехват нажатия клавиши
Проблема в чем моя программа должна быть не активной и в это же время проверять не нажата ли кнопка...

Перехват нажатия клавиши
Добрый день. Задали сделать блокнот на Питоне. Столкнулся с такой проблемой. Нужно отследить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru