Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизХук на 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.028 c