Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Отловить нажатие Prin Screen


Автор: ecspertiza 21.12.2011, 12:43
Знаю что кроссплатформенного способа нет, поэтому решил писать реализацию под каждую ОС. Но и это оказалось не просто smile Нашел код кейлогера под венду, но и он ни Prin Screen ни Ctrl+Print Screen отловить не может. Можно ли вообще перехватить комбинации клавиш  Ctrl+Print Screen и\или 
Shift +Ctrl+Print Screen ? и если можно то как ? 

Автор: boostcoder 21.12.2011, 13:00
это же системное программирование. по вендусной теме нужно было создавать тему в вендусном разделе. по линуксячей - в линуксячем. по маковой - в маковом.

Автор: ecspertiza 21.12.2011, 13:06
Так и думал smile Попросим админов перенести в раздел "C/C++: Системное программирование и WinAPI". Хотя интересно вроде такая простая операция, но решения сходу не нашел.

Автор: ecspertiza 21.12.2011, 13:33
Кстати сейчас подумал, может в венде можно переназначить эти комбинации  клавишь на вызов моей программы ?

Автор: boostcoder 21.12.2011, 13:37
вот для вендус: http://answers.google.com/answers/threadview/id/133059.html

Добавлено через 5 минут и 1 секунду
для линукс, наверное самым простым способом будет чтение девайса клавиатуры. никаких суперправ для этого не нужно.
http://stackoverflow.com/questions/2775461/linux-keyboard-event-capturing-dev-inputx

Автор: bsa 21.12.2011, 13:45
Цитата(boostcoder @  21.12.2011,  14:37 Найти цитируемый пост)
для линукс, наверное самым простым способом будет чтение девайса клавиатуры. никаких суперправ для этого не нужно.

не самое разумное решение...
Может лучше это: http://stackoverflow.com/questions/50182/linux-x11-input-library-without-creating-a-window

Автор: ecspertiza 21.12.2011, 13:46
Вендовый пример, видел до того как ты ссылку скинул, и попробовал, он не работал, после того как ты ссылку скинул,я решил еще раз проверить, все заработало smile Аура наверное у тебя хорошаяsmile или руки у меня кривые

Автор: boostcoder 21.12.2011, 13:49
bsa, зачем ему для чтения клавы, лезть в дебри X сервера? хоть один плюс аргументируй. (кроме как для расширения кругозора)

Добавлено через 41 секунду
Цитата(ecspertiza @  21.12.2011,  13:46 Найти цитируемый пост)
Аура наверное у тебя хорошая

да. с аурой мы в сговоре.

Автор: bsa 21.12.2011, 14:12
Цитата(boostcoder @  21.12.2011,  14:49 Найти цитируемый пост)
хоть один плюс аргументируй.

1. надо искать среди эвентов ту клаву, которую юзает пользователь.
2. были у меня проблемы с клавой, когда я работал с ней через event. Причем, с PS/2 проблем не было, а от USB клавы ничего не получал.
При работе с X сервером этих проблем нет.

Автор: boostcoder 21.12.2011, 14:18
Цитата(bsa @  21.12.2011,  14:12 Найти цитируемый пост)
1. надо искать среди эвентов ту клаву, которую юзает пользователь.

вариант..

Автор: ecspertiza 22.12.2011, 16:46
Столкнулся с небольшой проблемой, с кодом который кинул bsa, отлавливает события хорошо, но он ловит всю клаву, и не дает выполнять обычный набор текста к примеру, как бы вернуть выполнение событий системе если это не нужная мне клавиша ?

я пробовал так

Код

    while(!m_stop) {
       XNextEvent(dpy, &ev);
       switch (ev.type) {
          case KeyPress:
             kc = ((XKeyPressedEvent*)&ev)->keycode;
             s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));

             if (!strcmp(s, "Print") && ctrlmodified && shiftmodified) {
                emit keyPress(HookKeybord::Print | HookKeybord::Shift | HookKeybord::Ctrl);
                continue;
             }

             if (!strcmp(s, "Print") && ctrlmodified) {
                emit keyPress(HookKeybord::Print | HookKeybord::Ctrl);
                continue;
             }

             if (!strcmp(s, "Print") && shiftmodified) {
                emit keyPress(HookKeybord::Print | HookKeybord::Shift);
                continue;
             }

             if (!strcmp(s, "Print")) {
                emit keyPress(HookKeybord::Print);
                continue;
             }

             XUngrabKeyboard(dpy, CurrentTime);
             XPutBackEvent(dpy, &ev);
             XGrabKeyboard(dpy, DefaultRootWindow(dpy),
                           true, GrabModeAsync, GrabModeAsync, CurrentTime);
             break;
          case Expose:
                while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ;
             break;
          case ButtonPress:
          case ButtonRelease:
          case KeyRelease:

          case MotionNotify:
          case ConfigureNotify:
          default:
             break;
       }
    }


мол если это не то событие что нам нужно убираем граб, ставим событие в очередь, и возвращаем граб. Но чет не сработало, пробовал тоже с XSendEvent тож не прокатило. Как можно побороть проблему ?

Автор: bsa 22.12.2011, 20:38
смотри QApplication::x11EventFilter.

Автор: ecspertiza 25.12.2011, 11:22
Спасибо всем за помощь. QApplication::x11EventFilter не помог ибо он клавиатуру не ловит. Но нашелся вариант с XSendEvent описал вот тут

https://sites.google.com/site/ecspertiza/stati/qt/perehvat-nazatia-print-screen-v-qt

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