Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Хук на WH_GETMESSAGE   Найти похожие ветки 

 
Alexis ©   (2004-10-13 20:02) [0]

Я ставлю 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-13 20:17) [1]

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


 
DVM ©   (2004-10-13 20:38) [2]

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

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

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


 
Alexis ©   (2004-10-15 12:02) [3]

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-15 15:36) [4]


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

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


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

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

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


 
DVM ©   (2004-10-17 10:08) [6]


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

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


 
Alexis ©   (2004-10-17 14:17) [7]


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

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

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

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


 
DVM ©   (2004-10-17 14:34) [8]

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


 
Alexis ©   (2004-10-17 14:39) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
14-1100172167
Ega23
2004-11-11 14:22
2004.11.28
Я вернулся.


1-1100621755
TDBGridEh
2004-11-16 19:15
2004.11.28
TDBGridEh - footer....


1-1100276695
Stype
2004-11-12 19:24
2004.11.28
Копирование файла


1-1100264944
Kasjan
2004-11-12 16:09
2004.11.28
Картинки в DBGridEh


4-1097838267
Wolffgang
2004-10-15 15:04
2004.11.28
Проблема с определением заголовка окна