![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
ReFleX |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 26.9.2004 Где: Таллинн Репутация: нет Всего: 3 |
Добрый день!
Рылся по форуму, но везде из подобных найденных тем в примерах используется библиотека которая отслеживает хук. Из кучи примеров у меня получилось собрать именно тот который мне нужен: DLL:
EXE
Вопрос остаётся тот же, возможно ли объеденить DLL вместе с EXE? Просто не очень хочеться тоскать библиотеку, пускай лучше EXE будет немного больше. Я слышал, что microsoft позволяет работать с Hook как в DLL так и для EXE, но примера я нигде не нашёл, решил обратиться с помощью на любимый форум. ![]() |
||||
|
|||||
SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Попробуйте вот так
char* DllFile = "HookExe.exe"; // и перенесите все функции в EXE |
|||
|
||||
ReFleX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 26.9.2004 Где: Таллинн Репутация: нет Всего: 3 |
Не думаю что это будет правильно...
![]() |
|||
|
||||
anwe |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
А такой хук не всегда требует нахождения функции-фильтра в отдельной длл-ке. Можно устанавливать и в своем приложении. Только и ловится будут свои сообщения.
|
|||
|
||||
ReFleX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 26.9.2004 Где: Таллинн Репутация: нет Всего: 3 |
Мне надо чтобы ловились нажатия клавиш вне программы, этого я добился, но так же нужно чтобы библиотеки небыло, чтобы не таскаться с ней.
|
|||
|
||||
anwe |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: 1 Всего: 23 |
Все системные хуки и хуки для потоков в другом приложении должны находиться в DLL.
|
|||
|
||||
Dude03 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.4.2006 Репутация: 1 Всего: 6 |
А в чем проблема?=) Почему нельзя загружать либу из ресурсов приложения. Пусть тебя не смущает асм-код. Просто посмотри какие надо юзать функции(их имена после invoke):
|
||||
|
|||||
ReFleX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 26.9.2004 Где: Таллинн Репутация: нет Всего: 3 |
||||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Эта DLL, содержащаю хук, должна подгружаться во все процессы, в которых будет выполняться код, так что
anwe прав: только локальные хуки можно ставить, используя процедуру, которая находится в EXE.
-------------------- ... |
|||
|
||||
SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Остаётся лишь распознать вызов LoadLibrary (по третьему параметру) и подкорректировать стек. Не так велики ухищрения. Сделать можно. Естественно, Entry Point должна быть своя — не та, что берётся из CRT0.C и CRTDLL.C, например (имена файлов VC). |
|||
|
||||
ReFleX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 26.9.2004 Где: Таллинн Репутация: нет Всего: 3 |
||||
|
||||
v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: нет Всего: 56 |
Вероятно это уже не актуально, но я хотел бы поделиться своими изыскаиями в области перехвата нажатия кнопки клавиатуры.
Не обязательно создавать длл для перехвата нажатий в текущем окне, но вот если вы хотите перехватывать нажатия из других окон... единственный выход - это длл. Если кому то интересно, могу выложитькод, где я перехватываю нажатия выполненные в этом окне |
|||
|
||||
Yra |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.9.2006 Где: Украина, Киев Репутация: нет Всего: нет |
||||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
погавариват что есть еще и хуки низкого уровня... и они не требуют типа без длл. Я честно маловерю) хотите - проверяйте) да и на делфях)...
а вообще можно и поэксперементировать с Dll-Exe-шкой)) SergeCpp писал... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
Подмена адресов в SDT чтоли? Как бы там ни было, вы должны понять, что когда устанавливается хук в чужом адресном пространстве должен находится Ваш модуль. Dll можно легко подгрузить в чужое адресное пространство, там все смещения вычисляются с учётом поправок(reloc), т.е. базовый адрес dll в адресном пространстве процесса может быть динамическим. А вот подгрузить Exe уже не так просто, нужно учесть кучу тонкостей PE формата, мне даже лень перечислять все. А сделать так, чтобы твой exe работал параллельно с основным в одном процессе вообще гиблая идея. Это сообщение отредактировал(а) W4FhLF - 3.1.2007, 08:52 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
kapbepucm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 993 Регистрация: 14.6.2007 Где: Латвия Репутация: нет Всего: 12 |
Проблема из этой области. Вызываю дочерний процесс. Надо в дочке на все потоки повесить клавиатурый Hook. На не большое время. Таких действий будет несколько (дочек много). Можно ли обойтись без dll? И как в этом случае корректно вызвать SetWindowsHookExA?
Это сообщение отредактировал(а) kapbepucm - 28.8.2007, 09:56 -------------------- (С) kapbepucm |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
есть низкоуровневые хуки , они работают без длл-ок (но мне это не нравится лично)..
P.S. возможно стоит пересмотреть архитектуру приложения и "включать" хук перед вызовом "дочек" и выключать при необходимости и уведомлять их о сообщениях.. (я прост не вижу смысла дублировать код в "дочках" если их не одна).... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kapbepucm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 993 Регистрация: 14.6.2007 Где: Латвия Репутация: нет Всего: 12 |
Ну, например, есть запущенных несколько дочек, и я хочу увидеть, что было нажато у конкретной дочке. Если использую WH_JOURNALRECORD, то получается в exe'шнике всё реализовать, правда Hook получается поставить на всю систему. Мне бы на конкретный процесс и только на клаву.
Это сообщение отредактировал(а) kapbepucm - 29.8.2007, 08:38 -------------------- (С) kapbepucm |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
хм... но ведь это ХУК глобальный, а не отправка уведомлений о нажатии клавиш процесса N родителю. Зачем хук тогда ?
Для конкретной и делай конкретно.... т.е. просто отсылай уведомления головному процессу о нажатии клавиши в дочке. Зачем хук? -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kapbepucm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 993 Регистрация: 14.6.2007 Где: Латвия Репутация: нет Всего: 12 |
У меня получается нестандартная ситуация. Дочка-это уже готовая (не моя) прога. Кроме как использовать Hook не вижу выхода... Может есть лучшие варианты?
Это сообщение отредактировал(а) kapbepucm - 29.8.2007, 08:48 -------------------- (С) kapbepucm |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
чТО значит "готовая не моя" ? Нет доступа к исходникам или вам лень разбираться в чужом коде? Выражайтесь яснее....
если есть исходники то: [Ваш модуль, имеет окно hwndMainProg] [Дочка : запускается, ей передается HWND окна главной программы (hwndMainProg) (да хоть через параметры вызова))] { оработка сообщений оконных дочкой, если нажата клавиша, то PostMessage(hwndMainProg, WM_***,wParam,lParam); где WM_ - нужное сообщение (вплоть до своих вида WM_USER+N, N>0; или зарегистрированных через RegisterWindowMessage(), или через нечто вроде WM_COPYDATA (ну что-то подобное было для переноса данных...)) } в главном модуле реализуете обработку того что надо (идентификацию от какой дочки сообщение тоже можете сделать как-то дополнительно....) Можете для связи использовать пайпы или сетевое соединение... вариантов межпроцессорного взаимодействия не один (ябы наверно юзал пайпы (pipes)..)... Если исходников нет - тогда хук в главном модуле. И смотреть какой окно активно (например) по нему идентифицировать дочку во время обработки в хук-процедуре клавиатурного сообщения.... В общем хотите чтобы подсказали более конкретно описывайте проблему.. мыж не гадалки) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
kapbepucm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 993 Регистрация: 14.6.2007 Где: Латвия Репутация: нет Всего: 12 |
Дочка- *.exe без исходников. Моя ситуация не позволяет создавать DLL (другой язык программирования, не важно какой). В общем, меня заинтересовал параметр dwThreadId. Думал, можно конкретно указать на что Hook вешать (типа, зачем вешать на всё, если есть возможность указать куда).
Это сообщение отредактировал(а) kapbepucm - 30.8.2007, 10:33 -------------------- (С) kapbepucm |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |