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

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

22.03.2013, 17:57. Показов 1009. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru