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

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

Хук на WH_GETMESSAGE [D6, NT4, Win2k, WinXP]


Alexis ©   (2004-10-13 20:02:00) 

Я ставлю hook на все системные сообщения :
GlobalData^.SysHookWin := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance, 0);

А вот вопрос-как в ф-ции GetMsgProc определить, что пришло сообщение WM_ACTIVATE? Насколько я знаю, информация о пришедшем сообщении содержится в lParam, но lParam занимает 4 байта, а WIN-сообщения только один...
Попробовал так:

function GetMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
newmsg : ^tagMSG;

begin
new(newmsg);
newmsg := @lParam;

if newmsg.message = WM_ACTIVATE then
  MessageBox(0, 'WM_ACTIVATE occured.', 'info', MB_ICONINFORMATION);

if code < 0 then
 begin
   Result:= CallNextHookEx(GlobalData^.SysHookWin, Code, wParam, lParam);
   Exit;
 end;
 ...

Но при смене активного окна мой MessageBox не появляется. Как определить сообщение, пришедшее в ф-цию?
Заранее спасибо.


Alexis   (2004-10-17 14:39:00) [1]

Может у тебя есть кусок кода с установкой WH_SHELL? Был бы очень признателен...


DVM   (2004-10-17 14:34:00) [2]

Попробуй использовать хук WH_SHELL - тот точно отслеживает активацию окна без проблем.


Alexis   (2004-10-17 14:17:00) [3]


> Ловушка, надеюсь, в dll???

Разумеется.
Я же ведь писал:

> При нажатии(отпускании) клавишы в любом приложении соответствующие
> MessageBox прекрасно срабатывают

Если бы ловушка была не в DLL, перехват нажатия клавиш во всехприложениях не происходил бы наверное...


DVM   (2004-10-17 10:08:00) [4]


> Alexis ©   (16.10.04 17:04) [5]

Ловушка, надеюсь, в dll???


Alexis   (2004-10-16 17:04:00) [5]

if TMSG(Pointer(lParam)^).message = WM_ACTIVATEAPP then
MessageBeep($FFFFFFFF);

Пробовал-реакция нулевая. Ни при одной смене окна сигнал не выдается!
Plz, help кто-нибудь!


DVM   (2004-10-15 15:36:00) [6]


> активного окна 'WM_ACTIVATE' по-прежнему не показывается!
> В чем здесь грабли?

Может ловить WM_ACTIVATEAPP?


Alexis   (2004-10-15 12:02:00) [7]

function GetMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

if code < 0 then
 begin
   Result:= CallNextHookEx(GlobalData^.SysHookWin, Code, wParam, lParam);
   Exit;
 end;

if TMSG(Pointer(lParam)^).message = WM_ACTIVATE then
 MessageBox(0, 'WM_ACTIVATE', 'INFO', MB_ICONINFORMATION);

if TMSG(Pointer(lParam)^).message = WM_KEYDOWN then
 MessageBox(0, 'WM_KEYDOWN', 'INFO', MB_ICONINFORMATION);

if TMSG(Pointer(lParam)^).message = WM_KEYUP then
 MessageBox(0, 'WM_KEYUP', 'INFO', MB_ICONINFORMATION);

 Result := CallNextHookEx(GlobalData^.SysHookWin, Code, wParam, lParam);

end;

При нажатии(отпускании) клавишы в любом приложении соответствующие MessageBox прекрасно срабатывают, а при смене активного окна 'WM_ACTIVATE' по-прежнему не показывается! В чем здесь грабли?


DVM   (2004-10-13 20:38:00) [8]

Я бы хотел поглядеть, что станет с твоей системой, как только ты наконец поймаешь WM_ACTIVATE. Не ставь туда MessageBox(), поставь звуковой сигнал что-ли. Но это так к слову.

if TMsg(Pointer(lParam)^).message = WM_ACTIVATE then ...

Другие сообщения ловушка ловит???


Alexis   (2004-10-13 20:17:00) [9]

Только что нашел LookUpTheMessage(). Не это случайно?


Наверх

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