ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |

03.06.2008, 10:01
|
|
Новичок
Регистрация: 02.06.2008
Сообщений: 4
Провел на форуме: 12856
Репутация:
0
|
|
Ловушка сообшений
Здравствуйте, помогите решить задачу.
Установил глобальный hook = SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
Необходимо поймать сообщение WM_SETCURSOR.
После запуска программы вылетает "Ошибка чтения памяти и её адрес"
Однако если использовать hook WH_JOURNALRECORD то программа запускается и такие сообщения как:
WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_KEYUP, WM_KEYDOWN
ловятся.
А вот WM_SETCURSOR Нет.
Может я что-то не указываю? Или это сообщение нужно обрабатывать как-то?
Спасибо.
Листинг :
var
HookHandle: hHook;
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of
WM_SETCURSOR : Label1.Caption:='Сообщение получено.';
end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;
|
|
|

03.06.2008, 12:55
|
|
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме: 3371897
Репутация:
1462
|
|
HookProc у тебя в dll находится?
|
|
|

03.06.2008, 13:02
|
|
Новичок
Регистрация: 02.06.2008
Сообщений: 4
Провел на форуме: 12856
Репутация:
0
|
|
нет. Все в одном.
|
|
|

03.06.2008, 13:15
|
|
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме: 3371897
Репутация:
1462
|
|
A global hook procedure can be called in the context of any application in the same desktop as the calling thread, so the procedure must be in a separate DLL module.
msdn
вообщем обработчик глобального хука должен быть расположен в dll (как раз чтобы избежать проблем с доступом к памяти и тп ...)
ну и коротенький экскурс ( http://www.delphisources.ru/pages/fa...eate_hook.html )
Подробнее о механизме хуков : http://sources.ru/delphi/dll/hooks_aspects.shtml
Лучше (понятнее) всего о хуках и перехватах у Рихтера описанно
Последний раз редактировалось Jes; 03.06.2008 в 13:18..
|
|
|

03.06.2008, 13:32
|
|
Новичок
Регистрация: 02.06.2008
Сообщений: 4
Провел на форуме: 12856
Репутация:
0
|
|
Изучал я их  .
Вроде ж делаю как в них и описывается.
|
|
|

03.06.2008, 16:43
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
Провел на форуме: 379101
Репутация:
136
|
|
Сообщение от hub00
Изучал я их  .
Вроде ж делаю как в них и описывается.
Вот хорошая статья, с практическим рассмотрением хуков, на мышку, правда язык, ассемблер.
http://www.wasm.ru/article.php?article=1001024
|
|
|

05.06.2008, 01:31
|
|
Новичок
Регистрация: 02.06.2008
Сообщений: 4
Провел на форуме: 12856
Репутация:
0
|
|
Вопрос маленький.
Вот я получаю дескрипторе текущего курсора для текущей формы.
a:=GetCursor();
А как сделать так чтоб я его получал за её пределами (глобальный дескриптор курсор)?
|
|
|
|
 |
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Ловушка для взломщика
|
k00p3r |
Чужие Статьи |
0 |
08.06.2005 16:48 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|