Соответствуют ли коды клавиш в Linux - PullRequest
2 голосов
/ 01 декабря 2011

В настоящее время я пытаюсь создать небольшую программу на C / C ++, которая имитирует нажатие клавиши на одной из мультимедийных клавиш (например, «Пауза / Воспроизведение»).

Для имитации нажатия клавиш я использовал функцию XTestFakeKeyEvent из библиотеки X11. Я нашел рабочий пример здесь на SO: Имитация нажатия клавиш в консольном приложении Linux C

Моя проблема в том, что те специальные ключи, которые я собираюсь смоделировать, не найдены в keysymdef.h -файле, где определены константы для используемой XKeysymToKeycode -функции.

Итак, я провел небольшое исследование и нашел этот пост , который привел меня к xmodmap -команде . Используя xmodmap -pk, я получил список, который включает эти ключи:

KeyCode Keysym (Keysym) ...
Value   Value   (Name)  ...
[...]
171     0x1008ff17 (XF86AudioNext)  0x0000 (NoSymbol)   0x1008ff17 (XF86AudioNext)  
172     0x1008ff14 (XF86AudioPlay)  0x1008ff31 (XF86AudioPause) 0x1008ff14 (XF86AudioPlay)  0x1008ff31 (XF86AudioPause) 
173     0x1008ff16 (XF86AudioPrev)  0x0000 (NoSymbol)   0x1008ff16 (XF86AudioPrev)  
174     0x1008ff15 (XF86AudioStop)  0x1008ff2c (XF86Eject)  0x1008ff15 (XF86AudioStop)  0x1008ff2c (XF86Eject)  
[...]

Используя эти определенные значения (например, 172 для воспроизведения / паузы) в качестве кодов клавиш для функции XTestFakeKeyEvent, я получил его на работу:

// Simulate Key-Press:
Display *display;
display = XOpenDisplay(NULL);

XTestFakeKeyEvent(display, 172, true, 0);
XTestFakeKeyEvent(display, 172, false, 0);
XFlush(display);

Теперь мой вопрос:

Могу ли я рассчитывать на то, что эти значения (целые числа) будут сопоставлены с этими ключами в каждой системе Linux? Если нет (что я и предполагаю), каков будет правильный способ динамического получения правильных отображений (в коде)?

1 Ответ

2 голосов
/ 01 декабря 2011

Я знаю, что это не окончательный ответ, но по моему опыту (в аналогичном проекте) сопоставления клавиш были одинаковыми на каждой Linux-машине, на которой я его пробовал. Это было только на машинах с раскладкой клавиатуры EN / US. Я не могу говорить о клавиатурах с альтернативными раскладками.

Извините, если это не полностью отвечает на ваш вопрос.

EDIT:

Я действительно посмотрел свой старый проект, и похоже, что я использовал эти функции для получения реальных кодов клавиш:

XStringToKeysym()
XKeysymToKeycode()

Посмотрите на страницы MAN, они довольно понятны.

Надеюсь, это помогло:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...