Главная страница
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.057 c
14-1100100839
}|{yk
2004-11-10 18:33
2004.11.28
Наконец-то вышел Firefox 1.0


9-1091007837
xdev
2004-07-28 13:43
2004.11.28
Работа с освещением


3-1099162141
Мирон
2004-10-30 22:49
2004.11.28
Как узнать кол-во удаленных записей в процедуре


4-1098254290
AlexTayfun
2004-10-20 10:38
2004.11.28
Изменить цвет чужого окна.


11-1083127231
earl Grey
2004-04-28 08:40
2004.11.28
HeapMM, KOl и строки