| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Key hook, перехват нажатия клавиш |
| Автор: ReFleX 30.10.2006, 19:05 | ||||
| Добрый день! Рылся по форуму, но везде из подобных найденных тем в примерах используется библиотека которая отслеживает хук. Из кучи примеров у меня получилось собрать именно тот который мне нужен: DLL:
EXE
Вопрос остаётся тот же, возможно ли объеденить DLL вместе с EXE? Просто не очень хочеться тоскать библиотеку, пускай лучше EXE будет немного больше. Я слышал, что microsoft позволяет работать с Hook как в DLL так и для EXE, но примера я нигде не нашёл, решил обратиться с помощью на любимый форум. |
| Автор: SergeCpp 30.10.2006, 19:40 |
| Попробуйте вот так char* DllFile = "HookExe.exe"; // и перенесите все функции в EXE |
| Автор: ReFleX 30.10.2006, 19:44 |
| Не думаю что это будет правильно... |
| Автор: anwe 30.10.2006, 20:27 |
| А такой хук не всегда требует нахождения функции-фильтра в отдельной длл-ке. Можно устанавливать и в своем приложении. Только и ловится будут свои сообщения. |
| Автор: ReFleX 30.10.2006, 20:34 |
| Мне надо чтобы ловились нажатия клавиш вне программы, этого я добился, но так же нужно чтобы библиотеки небыло, чтобы не таскаться с ней. |
| Автор: anwe 30.10.2006, 21:38 |
| Все системные хуки и хуки для потоков в другом приложении должны находиться в DLL. |
| Автор: ReFleX 31.10.2006, 02:15 |
| Т.е. если я правильно понял, включить dll в приложение а после уже при открытие EXE работать с включённой библиотекой. тут с WinAPI голову сломаешь, а тут ещё и ассемблер |
| Автор: Earnest 31.10.2006, 08:02 | ||
| Эта DLL, содержащаю хук, должна подгружаться во все процессы, в которых будет выполняться код, так что anwe прав: только локальные хуки можно ставить, используя процедуру, которая находится в EXE.
|
| Автор: SergeCpp 31.10.2006, 08:42 | ||
Остаётся лишь распознать вызов LoadLibrary (по третьему параметру) и подкорректировать стек. Не так велики ухищрения. Сделать можно. Естественно, Entry Point должна быть своя — не та, что берётся из CRT0.C и CRTDLL.C, например (имена файлов VC). |
| Автор: ReFleX 31.10.2006, 11:40 |
| Автор: v2v 6.11.2006, 18:14 |
| Вероятно это уже не актуально, но я хотел бы поделиться своими изыскаиями в области перехвата нажатия кнопки клавиатуры. Не обязательно создавать длл для перехвата нажатий в текущем окне, но вот если вы хотите перехватывать нажатия из других окон... единственный выход - это длл. Если кому то интересно, могу выложитькод, где я перехватываю нажатия выполненные в этом окне |
| Автор: Yra 30.12.2006, 14:18 |
| v2v, Выкладывай!!!! Или если не трудно - на мыло мне скинь пожалуйста : [email protected] |
| Автор: jonie 3.1.2007, 01:44 | ||
погавариват что есть еще и хуки низкого уровня... и они не требуют типа без длл. Я честно маловерю) хотите - проверяйте) да и на делфях)...
а вообще можно и поэксперементировать с Dll-Exe-шкой)) SergeCpp писал... |
| Автор: W4FhLF 3.1.2007, 08:51 | ||
Подмена адресов в SDT чтоли? Как бы там ни было, вы должны понять, что когда устанавливается хук в чужом адресном пространстве должен находится Ваш модуль. Dll можно легко подгрузить в чужое адресное пространство, там все смещения вычисляются с учётом поправок(reloc), т.е. базовый адрес dll в адресном пространстве процесса может быть динамическим. А вот подгрузить Exe уже не так просто, нужно учесть кучу тонкостей PE формата, мне даже лень перечислять все. А сделать так, чтобы твой exe работал параллельно с основным в одном процессе вообще гиблая идея. |
| Автор: kapbepucm 28.8.2007, 09:54 |
| Проблема из этой области. Вызываю дочерний процесс. Надо в дочке на все потоки повесить клавиатурый Hook. На не большое время. Таких действий будет несколько (дочек много). Можно ли обойтись без dll? И как в этом случае корректно вызвать SetWindowsHookExA? |
| Автор: jonie 28.8.2007, 23:21 | ||
есть низкоуровневые хуки , они работают без длл-ок (но мне это не нравится лично)..
P.S. возможно стоит пересмотреть архитектуру приложения и "включать" хук перед вызовом "дочек" и выключать при необходимости и уведомлять их о сообщениях.. (я прост не вижу смысла дублировать код в "дочках" если их не одна).... |
| Автор: kapbepucm 29.8.2007, 08:32 |
| Ну, например, есть запущенных несколько дочек, и я хочу увидеть, что было нажато у конкретной дочке. Если использую WH_JOURNALRECORD, то получается в exe'шнике всё реализовать, правда Hook получается поставить на всю систему. Мне бы на конкретный процесс и только на клаву. |
| Автор: jonie 29.8.2007, 08:37 |
| хм... но ведь это ХУК глобальный, а не отправка уведомлений о нажатии клавиш процесса N родителю. Зачем хук тогда ? Для конкретной и делай конкретно.... т.е. просто отсылай уведомления головному процессу о нажатии клавиши в дочке. Зачем хук? |
| Автор: kapbepucm 29.8.2007, 08:41 |
| У меня получается нестандартная ситуация. Дочка-это уже готовая (не моя) прога. Кроме как использовать Hook не вижу выхода... Может есть лучшие варианты? |
| Автор: jonie 29.8.2007, 21:32 |
| чТО значит "готовая не моя" ? Нет доступа к исходникам или вам лень разбираться в чужом коде? Выражайтесь яснее.... если есть исходники то: [Ваш модуль, имеет окно hwndMainProg] [Дочка : запускается, ей передается HWND окна главной программы (hwndMainProg) (да хоть через параметры вызова))] { оработка сообщений оконных дочкой, если нажата клавиша, то PostMessage(hwndMainProg, WM_***,wParam,lParam); где WM_ - нужное сообщение (вплоть до своих вида WM_USER+N, N>0; или зарегистрированных через RegisterWindowMessage(), или через нечто вроде WM_COPYDATA (ну что-то подобное было для переноса данных...)) } в главном модуле реализуете обработку того что надо (идентификацию от какой дочки сообщение тоже можете сделать как-то дополнительно....) Можете для связи использовать пайпы или сетевое соединение... вариантов межпроцессорного взаимодействия не один (ябы наверно юзал пайпы (pipes)..)... Если исходников нет - тогда хук в главном модуле. И смотреть какой окно активно (например) по нему идентифицировать дочку во время обработки в хук-процедуре клавиатурного сообщения.... В общем хотите чтобы подсказали более конкретно описывайте проблему.. мыж не гадалки) |
| Автор: kapbepucm 30.8.2007, 10:22 |
| Дочка- *.exe без исходников. Моя ситуация не позволяет создавать DLL (другой язык программирования, не важно какой). В общем, меня заинтересовал параметр dwThreadId. Думал, можно конкретно указать на что Hook вешать (типа, зачем вешать на всё, если есть возможность указать куда). |