![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему хук срабатывает несколько раз? [D5, Win95/98, WinXP]
guest_Dmitry © (2005-02-10 08:05:00)Ставлю ловушку WH_CBT, перехватываю сообщение HCBT_CREATEWND. В результате при создании окна хук срабатывает несколько раз. Почему так?
guest_Dmitry (2005-02-10 13:03:00) [21]мда.. действительно, исправил на
TCWPStruct(Pointer(lParam)^).message = WM_CREATE
но все равно получается, что хук срабатывает раз 15..
GuAV (2005-02-10 12:59:00) [22]
> CallWndProc(code : integer; wParam : word; lParam :
> longint
wParam когда-то может и был Word но не для
> [D5, Win95/98, WinXP]
Надо так
function CallWndProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
GuAV (2005-02-10 12:52:00) [23]
> if TMsg(Pointer(lParam)^).message = WM_CREATE
А почему TMsg ? Где написано что lParam указывает на TMsg ?
guest_Dmitry (2005-02-10 12:33:00) [24]SendMessage - сообщение в мое приложение, в котором передаю handle окна, которое создается. А что не так с SendMessage?
VMcL (2005-02-10 12:25:00) [25]>> guest_Dmitry (10.02.05 12:20) [7]
> Что не так в коде?..
SendMessage.
guest_Dmitry (2005-02-10 12:20:00) [26]Мне момент не важен, нужно зафиксировать сам факт открытия окна.
Почитав статью с этого сайта, хук ставлю следующим образом:
function CallWndProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
AppWnd: HWND;
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;
if TMsg(Pointer(lParam)^).message = WM_CREATE
then
begin
AppWnd:= GetForegroundWindow();
SendMessage(HWND_BROADCAST, WM_MYKEYHOOK, wParam, AppWnd);
end;
CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Result:= 0;
end;
В результате получаю бесконечное срабатывание хука. Что не так в коде?..
Digitman (2005-02-10 11:26:00) [27]смотря в какой момент нужен перехват
WH_CBT - до постановки сообщения в очередь
WH_CALLWNDPROC - в момент постановки сообщения в очередь
WH_CALLWNDPROCRET - в момент возврата результата обработки сообщения
WH_GETMESSAGE - в момент выборки сообщения из очереди вызовами Get/PeekMessage
guest_Dmitry (2005-02-10 11:18:00) [28]Чтобы перехватить сообщение WM_CREATE какую ловушку следует использовать?
Digitman (2005-02-10 08:52:00) [29]
> Справку я прочитал, но почему несколько раз?
не знаю, что ты там читал, но в справке четко написано почему)
при создании окна система посылает сначала WM_NCCREATE , а затем WM_CREATE
и, согласно справке, перед посылкой КАЖДОГО из этих сообщений, система вызывает хук-ф-цию HCBT_CREATEWND
guest_Dmitry (2005-02-10 08:26:00) [30]Справку я прочитал, но почему несколько раз? Может ловушку тогда другую поставить?
guest_Dmitry (2005-02-10 08:23:00) [31]Справку я прочитал, но почему несколько раз? Может ловушку тогда другую поставить?
Digitman (2005-02-10 08:14:00) [32]цитата из станд.справки :
HCBT_CREATEWND A window is about to be created. The system calls the hook procedure before sending the WM_CREATEor WM_NCCREATEmessage to the window