Всем привет!
Надо было сделать глобальный хук на создание окна (WH_SHELL + HSHELL_WINDOWCREATED). Делал хук по статье "Hooks - аспекты реализации" (
http://delphimaster.ru/articles/hooks/index.html) и её 3-му примеру (
http://delphimaster.ru/articles/hooks/example.zip). Выглядит это так:
Procedure SetHook(Switch: Boolean; hMainProg: HWnd) Export; Stdcall;
Begin
If Switch = True Then
Begin
GlobalData^.SysHook := SetWindowsHookEx(WH_SHELL, @HookProc, HInstance, 0);
end
Else
Begin
UnHookWindowsHookEx(GlobalData^.SysHook);
end;
end;
Где функция-фильтр имеет вид:
Function HookProc(Code: Integer; WParam: WParam; LParam: LParam): LRESULT; Stdcall;
Begin
If Code = HSHELL_WINDOWCREATED Then
SendMessage(GlobalData^.MyAppWnd, WM_MYMESS, WParam, LParam);
Result := CallNextHookEx(GlobalData^.SysHook, Code, WParam, LParam);
End;
В самой программе делаю:
Procedure TForm1.WndProc(Var Msg: TMessage);
Begin
Inherited;
If Msg.Msg = WM_MYMESS Then
Begin
ListBox1.Items.Insert(0, IntToStr(Msg.WParam));
End;
End;
Вроде бы всё делал правильно, но у процессов, запускающих окна, а потом и в моей программе (или в Delphi, если запускаю из-под неё) возникает сообщение "Память не может быть Read", а за ним, если правильно помню, AV. Откомпилировал 3-й пример из статьи, думал, я что-то не так "подправил", так он тоже как-то не очень стабильно работает, тоже эти ошибки выдаёт. Систему DEP отключил полностью, вычитав, что она такие ошибки может провоцировать. Подскажите, что я не так делаю, может, где какая ошибка проскочила?