Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук без формы 
:(
    Опции темы
Dmitry_177
Дата 31.12.2006, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Если нужно сделать хук без формы, нужно всеравно создавать цикл сообщений т.е. примерно так?

Код

 hKeyHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
 if hKeyHook = 0 then PostQuitMessage(GetLastError);

 while GetMessage(AMessage, 0, 0, 0) do
 begin
   TranslateMessage(AMessage);
   DispatchMessage(AMessage);
 end;

 UnhookWindowsHookEx(hKeyHook);


Или надо еще какнибудь?
PM MAIL   Вверх
bems
Дата 31.12.2006, 04:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



для *_LL  -хуков цикл обработки сообщение нужен.  TranslateMessage можно убрать.

if hKeyHook = 0 then PostQuitMessage(GetLastError) 
ну это слишком smile

Может даже не начинать цикл если не вышло, а?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
bems
Дата 31.12.2006, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



если возникнут проблемы с этим кодом попробуй перед SetWindowsHookEx заранее создать себе очередь сообщений (например "безобидным" вызовом PeekMessage)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 31.12.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Т.е. я как понял вот так?
Код

 hKeyHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc, hInstance, 0);
 if hKeyHook = 0 then Exit;  // Если PostQuitMessage(GetLastError) слишком

 while GetMessage(AMessage, 0, 0, 0) do
   DispatchMessage(AMessage);

 UnhookWindowsHookEx(hKeyHook);

PM MAIL   Вверх
Dmitry_177
Дата 31.12.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



А еще такой вопрос, такую программу ИМХО можно отключить только в диспетчере задачь или какой-нибудь функцией завершения потока или сама она выключится по завершению работы Windows, а вопрос в том, то что будет ли в таком случае UnhookWindowsHookEx(hKeyHook); срабатывать после цикла сообщений? Мне кажется что нет... Если нет то как правильно снимать хук? Может в полях initialization создавать хук в а finalization убивать? Или еще как-то???
PM MAIL   Вверх
bems
Дата 31.12.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



хук принадлежит потоку и автоматически уничтожается при завершении потока (не процесса)

Добавлено @ 15:07 
Цитата(Dmitry_177 @  31.12.2006,  13:01 Найти цитируемый пост)
по завершению работы Windows
тогда в числе процих шлется WM_QUIT



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 4.1.2007, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



1). WM-сообщения они же оконные, разве будут они слаться в данном случае, когда нету в приложении окна?

2). Если все же будут слаться, т.е. WM_QUIT как его обрабатывать? В цикле придется? Т.е. так?
Код

while GetMessage(AMessage, 0, 0, 0) do
  begin
    if AMessage.Message = WM_QUIT then
      begin
        UnhookWindowsHookEx(hKeyHook);
        // другие действия по завершению программы, сохранение данных например..
      end;
    DispatchMessage(AMessage);
  end;


Если не так поправьте меня пожалуйста..
PM MAIL   Вверх
bems
Дата 4.1.2007, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Dmitry_177 @  4.1.2007,  01:57 Найти цитируемый пост)
будут они слаться в данном случае, когда нету в приложении окна?
кое-какие будут


Цитата(Dmitry_177 @  4.1.2007,  01:57 Найти цитируемый пост)
 WM_QUIT как его обрабатывать? 
когда GetMessage находит в очереди єто сообщение рна возвращает false. Цикл обработки сообщений прекращается 
Код

while GetMessage(AMessage, 0, 0, 0) do

Вот тут уже есть реакция на WM_QUIT


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 4.1.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Т.е. так? 

Код

 while GetMessage(AMessage, 0, 0, 0) do
   DispatchMessage(AMessage);

 UnhookWindowsHookEx(hKeyHook);
 // Сохраняем данные

PM MAIL   Вверх
bems
Дата 5.1.2007, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



ага


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 5.1.2007, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Сделал "сохранение данных" после такого цикла, в файле сохраняю, не сохраняются, по завершению программы(выключал из диспетчера задачь и windows выключал с работающей программой).. Ну не сохраняются они...(((
PM MAIL   Вверх
bems
Дата 7.1.2007, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(bems @  31.12.2006,  15:00 Найти цитируемый пост)
тогда в числе процих шлется WM_QUIT
не шлется, я соврал  smile  , сори
И не потому что нет окна, а потому что вместо него предполагается реакция приложения на WM_ENDSESSION, а оно шлется окнам  smile 
Если ты не хочешь создавать свое окно, то поставь еще один хук (WH_CALLWNDPROC) и лови это сообщение, когда идет другим окнам. 
Есть еще вариант написать WinLogon notification package, но это из пушки по воробьям

Добавлено @ 06:37 
А если пишешь кейлогер, то вообще лучше сохранять данные на лету, потому что от вырубания через таскманагер тебя ни что не спасет


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 9.1.2007, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



Если ты не хочешь создавать свое окно, то поставь еще один хук (WH_CALLWNDPROC) и лови это сообщение, когда идет другим окнам.

Какое сообщение WM_QUIT или WM_ENDSESSION?

WM_ENDSESSION при выключении компьютера, скорей всего его и надо ловить хуком.. Но у меня тогда такой вопрос, цикл тогда никогда не заканчивается по сути, если WM_QUIT не шлется?

А вот как быть если мою такую программу хотят выключить через диспетчер задачь? Можно ли это какнибудь отлавливать?
PM MAIL   Вверх
bems
Дата 9.1.2007, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Dmitry_177 @  9.1.2007,  02:35 Найти цитируемый пост)
Какое сообщение WM_QUIT или WM_ENDSESSION?
WM_ENDSESSION

Цитата(Dmitry_177 @  9.1.2007,  02:35 Найти цитируемый пост)
цикл тогда никогда не заканчивается по сути, если WM_QUIT не шлется?
ну в этом и была твоя проблема вроде бы. Ты ж сам писал: после цикла создаю файл, а файл не создается. Значит до "после цикла" дело не доходит

Цитата(Dmitry_177 @  9.1.2007,  02:35 Найти цитируемый пост)
А вот как быть если мою такую программу хотят выключить через диспетчер задачь? Можно ли это какнибудь отлавливать? 
Против лома нет приема. Можно прехватывать АПИ, но этого не делают всуе



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 9.1.2007, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



У меня тогда еще несколько вопросов, надеюсь что последние:

1. Если цикл никогда не заканчивается и т.д., вот так нормально будет оставить или лучше как-то еще его написать?
Код

while GetMessage(AMessage, 0, 0, 0) do
   DispatchMessage(AMessage);


2. Правильно ли будет так обрабатывать хук на WM_ENDSESSION?
Код

function MessageProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
  if nCode = HC_ACTION then
    Result := CallNextHookEx(hMsgHook, nCode, WParam, LParam);
  if WParam = WM_ENDSESSION then
    begin
      // сохраняем данные
    end;
end;

...

hMsgHook := SetWindowsHookEx(WH_CALLWNDPROC, @MessageProc, hInstance, 0);


3. Если делать перехват АПИ, на какую(ие) лучше функцию(ии) ставить перехват, которая(ые) может/могут вырубить мою программу?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.