Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для Кот Ангенс
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629

Ошибка перехвата клавиатуры (hook)

22.03.2013, 17:57. Показов 988. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача: запустить приложение и отлавливать нажатые клавиши. Привожу часть кода, отвечающую за это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//dllmain.cpp:
#include "dll_communication.h"
 
DllCommunication* link;
HANDLE keyevent;
 
extern "C" {
    __declspec(dllexport)
    LRESULT CALLBACK LowLevelKeyboardProc(int, WPARAM, LPARAM lParam) {
        //Клавиши со стрелками
        if (PKBDLLHOOKSTRUCT(lParam)->vkCode >= 0x25 && PKBDLLHOOKSTRUCT(lParam)->vkCode <= 0x28) {
            link->direction = PKBDLLHOOKSTRUCT(lParam)->vkCode - 0x25;
            SetEvent(keyevent);
        }
        return 1;
    }
 
    //...
}
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
//main.cpp:
//...
 
HMODULE dll;
HANDLE keyevent;
volatile bool exitLoop = false;
DllCommunication* link;
 
DWORD WINAPI Loop(PVOID) {
    while (true) {
        //Ждем нажатия клавиши или сигнала о выходе из цикла
        WaitForSingleObject(keyevent, INFINITE);
        if (exitLoop) {
            //Показываем, что поток завершился
            SetEvent(threadExited[Thr::Loop]);
            return 0;
        }
        log << (int)link->direction << endl;
    }
}
 
//...
 
int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
    //...
 
    //Загружаем DLL и функцию-обработчик
    //...
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, hproc, dll, 0);
 
    //Дальше запускаем процесс и ждем его завершения
    //...
}
Сама программа связывается с DLL через именованные проецируемые в память файлы. Когда DLL ловит символ, она пишет в проекцию файла его код и устанавливает событие (keyevent). После этого "пробуждается" поток в программе и выводит код символа в файл.
Само по себе все работает. Проблема в том, что переватывать нажатия мне нужно у стороннего приложения. Если же запускать приложение (пускаю с ключами DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS), создается впечатление, будто дочерний процесс отрубает мой перехватчик: при первом нажатии система виснет на секунду, а дальше перехватчик вообще не работает. Нажатые клавиши не ловятся, в файл не пишутся.
Скажите, не встречались ли Вы с подобным? Как приложение может вырубить чужие хуки, и, что важнее, как этого избежать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2013, 17:57
Ответы с готовыми решениями:

Hook клавиатуры
Помогите мне пожалуйста с лабораторной работой, мне нужен хук клавиатуры в win32 VS, сама я не дружу с win32..

Hook клавиатуры и мыши
Я пересмотрел кучу сайтов по похожим запросам И нигде толком и понятно не написано выручайте люди.

Hook клавиатуры не работает
Всем доброй ночи, возникла такая проблема: дано задание написать аудит клавиатуры, еще проще обычный кейлоггер. Вот код hooks.h ...

1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
22.03.2013, 19:24
WH_KEYBOARD_LL выполняется в контексте установившего её потока, если он в цикле обработки сообщений. Если хук не работает или тормозит, он вырубается системой по таймауту (его значение где-то в реестре). Так что надо бы в цикле GetMessage или, если нужны event'ы, MsgWaitForMultipleObjects и PeekMessage.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2013, 19:24
Помогаю со студенческими работами здесь

В чем преимущество trampoline hook над обычным hook?
Объясните пожалуйста в чем преимущество trampoline hook и hook? Никак не могу понять

метод для перехвата клавиш клавиатуры
Здравствуйте,имею метод для перехвата клавиш клавиатуры,но не знаю куда его вставить и как его использовать protected bool...

Hook клавиатуры
Приветствую всех, подскажите мне, пожалуйста, как установить хук клавиатуры на кнопку F12? С хуками пытался разобраться... но не особо...

Hook клавиатуры.
Народ нужна помощь и срочно. Задание: Реализовать класс Хук клавиатуры корректно обрабатывающий нажатие русских клавиш. На форме нахотся...

Hook клавиатуры и мыши
Мне нужно сделать hook клавиатуры и мыши в vs 2010, но у меня проблемы с фантазией, и я не совсем понимаю как это сделать) помогите плз)


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru