![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Если нужно сделать хук без формы, нужно всеравно создавать цикл сообщений т.е. примерно так?
Или надо еще какнибудь? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
для *_LL -хуков цикл обработки сообщение нужен. TranslateMessage можно убрать.
if hKeyHook = 0 then PostQuitMessage(GetLastError) ну это слишком Может даже не начинать цикл если не вышло, а? -------------------- Обижено школьников: 8 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
если возникнут проблемы с этим кодом попробуй перед SetWindowsHookEx заранее создать себе очередь сообщений (например "безобидным" вызовом PeekMessage)
-------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Т.е. я как понял вот так?
|
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
А еще такой вопрос, такую программу ИМХО можно отключить только в диспетчере задачь или какой-нибудь функцией завершения потока или сама она выключится по завершению работы Windows, а вопрос в том, то что будет ли в таком случае UnhookWindowsHookEx(hKeyHook); срабатывать после цикла сообщений? Мне кажется что нет... Если нет то как правильно снимать хук? Может в полях initialization создавать хук в а finalization убивать? Или еще как-то???
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
хук принадлежит потоку и автоматически уничтожается при завершении потока (не процесса)
Добавлено @ 15:07 тогда в числе процих шлется WM_QUIT -------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
1). WM-сообщения они же оконные, разве будут они слаться в данном случае, когда нету в приложении окна?
2). Если все же будут слаться, т.е. WM_QUIT как его обрабатывать? В цикле придется? Т.е. так?
Если не так поправьте меня пожалуйста.. |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
когда GetMessage находит в очереди єто сообщение рна возвращает false. Цикл обработки сообщений прекращается
Вот тут уже есть реакция на WM_QUIT -------------------- Обижено школьников: 8 |
||||
|
|||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Т.е. так?
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
ага
-------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Сделал "сохранение данных" после такого цикла, в файле сохраняю, не сохраняются, по завершению программы(выключал из диспетчера задачь и windows выключал с работающей программой).. Ну не сохраняются они...(((
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
не шлется, я соврал
И не потому что нет окна, а потому что вместо него предполагается реакция приложения на WM_ENDSESSION, а оно шлется окнам Если ты не хочешь создавать свое окно, то поставь еще один хук (WH_CALLWNDPROC) и лови это сообщение, когда идет другим окнам. Есть еще вариант написать WinLogon notification package, но это из пушки по воробьям Добавлено @ 06:37 А если пишешь кейлогер, то вообще лучше сохранять данные на лету, потому что от вырубания через таскманагер тебя ни что не спасет -------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Если ты не хочешь создавать свое окно, то поставь еще один хук (WH_CALLWNDPROC) и лови это сообщение, когда идет другим окнам.
Какое сообщение WM_QUIT или WM_ENDSESSION? WM_ENDSESSION при выключении компьютера, скорей всего его и надо ловить хуком.. Но у меня тогда такой вопрос, цикл тогда никогда не заканчивается по сути, если WM_QUIT не шлется? А вот как быть если мою такую программу хотят выключить через диспетчер задачь? Можно ли это какнибудь отлавливать? |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
WM_ENDSESSION
-------------------- Обижено школьников: 8 |
||||
|
|||||
| Dmitry_177 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
У меня тогда еще несколько вопросов, надеюсь что последние:
1. Если цикл никогда не заканчивается и т.д., вот так нормально будет оставить или лучше как-то еще его написать?
2. Правильно ли будет так обрабатывать хук на WM_ENDSESSION?
3. Если делать перехват АПИ, на какую(ие) лучше функцию(ии) ставить перехват, которая(ые) может/могут вырубить мою программу? |
||||
|
|||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
вобщем да, но что случиться если тачку перезагрузят некорректно?
-------------------- Обижено школьников: 8 |
||||
|
|||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Запустил свою программу с кодом из пункта 2, функцию MessageProc обработки хука написал как тут, скопировал точнее, запустил, у меня аж Delphi вырубилась как только скомпилировалась программа и токо-токо успела запуститься.. Просто изначально писал код без delphi, т.к. небыло тогда его рядом... И что-то я не пойму никак почему так...??? Вроде все правильно...
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
А тут все нормально? хук WH_CALLWNDPROC работает в контексте чужого процесса. Поэтому сохранение данных должно быть продуманым и синхронизированым. Учитывая доступность памяти и хэндлов Добавлено @ 08:59 hMsgHook известен в библиотеке? если нет, то лучше вместо него в вызове CallNextHookEx передавай ноль. Начиная с 2000й это работает. В этой процедуре хука wparam это не сообщение. Сообщение лежит в структуре CWPSTRUCT указатель на которую передается в lparam nCode = HC_ACTION означает что тут может быть твоя обработка, а CallNextHookEx нужно вызывать во всех случаях -------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
WH_CALLWNDPROC нужно в dll ставить??
Я в программе сделал... мне надо в программе, чтобы безо всяких там dll-ок... Это сообщение отредактировал(а) Dmitry_177 - 10.1.2007, 10:49 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
без длл не выйдет
-------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Т.е. отследить выключение windows без длл в моем случае никак нельзя, кроме как перехвата api функций?
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
ну можно создат окно нулевых размеров, но тебе это вроде не подходило... Или может быть?
-------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
нет.. окно создавать не подходит...
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
тогда лучше ДЛЛ? опиши задачу, имхо окно меньший оверхед... Или дело в шифрованости? тогда всеравно не то...
-------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Что значит оверхед? )))
Или дело в шифрованости? Типа того.. Есть программы - анализаторы кода, которые секут невидимые окна.. Поэтому хочу обойтись без окон.. dll- тоже быстро секутся некоторыми программами, ведь при хуке происходит инжект dll в чужие программы... А вот хук на WH_KEYBOARD_LL к моему удивлению не секется, покрайней мере теми которыми я проверял... Скорей всего это из-за того что программа работает напрямую с драйвером клавиатуры... Вот понадобилось запуск и остановку компьютера отслеживать.. С запуском все понятно, при запуске проги будет производиться запись что комп включен, т.к. она будет запускаться при запуске.. А вот с выключением уже проблемы...((( До сих пор все парюсь, никак ничего не придумаю...((( Это сообщение отредактировал(а) Dmitry_177 - 16.1.2007, 01:48 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
ну пиши куда-нить
17:32:12 - все спокойно 17:32:13 - все спокойно 17:32:14 - все спокойно при следующем запуске проверяй последнюю запись и будешь знать время выключения Но только нужно еще защититься от случая когда тебя прервут посреди записи -------------------- Обижено школьников: 8 |
|||
|
||||
| Dmitry_177 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 22.9.2006 Репутация: нет Всего: нет |
Ок, идею понял )))
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |