Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Перехват хоткеев до X11


Автор: _GRIN_ 11.11.2009, 18:29
Здравствуйте.
Пишу программу, которая должна работать как банкомат - т.е. в полноэкранном режиме и не допускать пользователя (за исключением админа) к каким либо средствам ОС (включая терминалы).
Программа  запускается как демон. ОС Линукс (Мандрива). Облочка - гном.
С перехватом хоткеев возникла проблема. Если то что присылает X11 я ещё могу прехватить до оконного мэнеджера (гном), то с переключением терминалов - не получается. Поясняю (Alt+F4, Alt+F2, Ctrl+Alt+D - могу,  а вот Ctrl+Alt+F3 к примеру - не могу).
Подскажите, пожалуйста, в какую сторону копать.

Заранее спасибо.

Автор: vinick 11.11.2009, 23:25
ИМХО копать надо в сторону /etc/inittab и отключать там виртуальные консоли и ctrl-alt-del там же перехватывать.

man inittab

Автор: nickless 12.11.2009, 13:28
А почему бы просто не поодключать все эти хоткеи в конфиге иксов?
Код

Section "ServerFlags"

# Uncomment this to disable the <Ctrl><Alt><Fn> VT switch sequence
# (where n is 1 through 12).  This allows clients to receive these key
# events.

    Option      "DontVTSwitch"              "true"

# Uncomment this to disable the <Crtl><Alt><BS> server abort sequence
# This allows clients to receive this key event.

    Option      "DontZap"                 "true"

# Uncomment this to disable the <Crtl><Alt><KP_+>/<KP_-> mode switching
# sequences.  This allows clients to receive these key events.

    Option      "DontZoom"                  "true"

EndSection

Автор: DrHex 12.11.2009, 14:29
модуль ядра, и хукать прерывания.....

Автор: MAKCim 12.11.2009, 16:29
X читает event'ы из /dev/input/eventX
остается разобраться с форматом вывода и структурой буфера

Автор: Loki 12.11.2009, 16:52
хоткеи можно перехватить через XGrabKey()

а как на счет принтскрина? как отменить?
 
p.s. принтскрим можно сделать и мышкой.

Автор: _GRIN_ 21.11.2009, 22:34
Cпасибо всем smile за ваше участие. Я извиняюсь, что не однозначно сформулировал задачу. Необходимо иметь возможность включать и отключать перехват - Отключать для работы администратора.
vinick, /etc/inittab - верно. Но к сожалению не получится менять "на лету" - нужна перезагрузка - способ рабочий, но к сожалению не совсем то, что хотелось бы получить.
nickless, - тоже отличный способ. Проблема таже что и с /etc/inittab
DrHex, "модуль ядра" - вы меня переоцениваете  smile 
MAKCim,  спасибо, вроде бы то что надо - буду копать - если накопаю - опишусь.
Loki, к сожалению через XGrabKey не удастся перехватить уже забинденные комбинации.

Автор: _GRIN_ 22.11.2009, 02:29
Копаю по посту MAKCim-а:
судя по всему копать следует сюда: http://bec-systems.com/site/281/how-to-implement-an-interrupt-driven-gpio-input-in-linux
Но собрать у меня пока не получилось. при компиляции такую кучу ошибок касательно путей к файлам выдаёт, что консоль всё не вмещает (выводил в файл и потом глядел). Ошибки с путями (у меня /usr/include/glib-2.0 - а в хидерах (находящихся в этих папках #include <glib/...> - причём есть файлы которых у меня вообще нет, например glibconfig.h
Цитата

/usr/include/glib/gtypes.h:34:24: error: glibconfig.h: Нет такого файла или каталога

ну и после этого соответственно куча ошибок компиляции.

Копаю дальше (попробую на ноуте под мандривой - на десктопе у меня сусь)...

Автор: ir4y 22.11.2009, 07:58
Сталкивался с подобной проблемой...
Решил следующим образом
1) в inittab отключил виртуальные консоли
2) в своей программе реализовал формочку для аутентификации...
после успешной аутентификации открываеется xterm
вот так


ЗЫ
как ты перехватывешь Alt+F4, Alt+F2, Ctrl+Alt+D ?

Автор: _GRIN_ 24.11.2009, 11:30
ir4y, вот функция:
Код

#include <X11/Xlib.h>
void captureHotKey(const char*key,int mod,bool capture)
{
    Display display=XOpenDisplay(0);
    Window window=DefaultRootWindow(display);
    int keyID=XKeysymToKeycode(display,XStringToKeysym(key));
    if(capture) {
        XGrabKey(display,keyID,mod,window,1,1,1);
    } else {
        XUngrabKey(display,keyID,mod,window);
    }
}

key - клавиша
mod - модификатор (Shift, Alt, Ctrl ...)
capture -  true: захватить комбинацию ; false: отпустить комбинацию
пример использования:
Код

captureHotKey("F2",ControlMask,true);           //захватить комбинацию Ctrl+F2
captureHotKey("I",ControlMask | Mod1Mask,true); //захватить комбинацию Cntl+Alt+I
captureHotKey("F4",Mod1Mask,true);              //захватить комбинацию Alt+F4
captureHotKey("Tab",0,true);                    //захватить комбинацию Tab (одна клавиша - Таб не будет обрабатываться)
//---
captureHotKey("F2",ControlMask,false);          //отпустить комбинацию Сtrl+F2

Если комбинация уже захвачена (например оконным мэнеджером, то захватить её не удастся).
Осводобить (XUngrabKey) можно только ту комбинацию, которую захватил сам.
Больше про XGrabKey можно прочитать тут: http://tronche.com/gui/x/xlib/input/XGrabKey.html

Примечание: проверь, есть ли у тебя файл /usr/include/X11/Xlib.h
По умолчанию его может не быть,  тогда тебе нужно будет установить *xorg-*devel* пакет
Вот пакет установленный у меня (Mandriva 64-bit)
lib64xorg-x11-devel-7.3-4mdv2009.0

Автор: green5 24.11.2009, 16:04
А чем XGrabKeyboard не устраивает?

Автор: _GRIN_ 24.11.2009, 17:31
green5, XGrabKeyboard  железно захватывает клавиатуру - спасибо smile, за исключением Ctrl+Alt+F<x> и возможно каких-то ещё комбинаций, обрабатываемых до иксов.
Как сделать, что бы моё приложение (работающее в потоке парралельном потоку-перехватчику) получало ввод с клавиатуры - пока не знаю smile Но метод рабочий smile что радует. 
Всё вроде ясно по данной теме за исключением /dev/input/event0 горячего перехвата/отпускания  Ctrl+Alt+F<x> и Ctrl+Alt+Del
В текущий момент данные вопросы отложу.

Всем спасибо, закрываю тему

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)