![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хук на 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(). Не это случайно?