Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему хук срабатывает несколько раз? [D5, Win95/98, WinXP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо