![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в глобальном хуке определить кому адресовано отловленное msg?
cosinus © (2005-07-05 17:59:00)Что то копаюсь, копаюсь... Никак понять не могу.
Не подскажите?
cosinus (2005-07-06 13:16:00) [1]У меня получилось вот так...
Вроде нормально.
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
Hnd:HWND;
Wnd:HWND;
fwnd:HWND;
begin
if CWPSTRUCT(Pointer(lParam)^).message=WM_SYSCOMMAND then
if CWPSTRUCT(Pointer(lParam)^).wParam=SC_MINIMIZE then
begin
Wnd:=CWPSTRUCT(Pointer(lParam)^).hwnd;
hnd:=Find(FindText);
if Wnd=Hnd then
begin
fwnd:=findwindow(nil,'SSSS');
if (fwnd)<>0 then
PostMessage(fwnd,WM_NOTIFYMINIMAZEAPP,0,0);
end;
end;
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;
Игорь Шевченко (2005-07-06 13:15:00) [2]Digitman © (06.07.05 12:43) [15]
DefWindowProc'ом в Win32k.sys
alpet (2005-07-06 13:01:00) [3]1. Я проверил - указанный хук вполне годится для задачи. Т.е. вполне вероятно юзается и SendMessage (у меня XP, а там это без разницы).
2. функцию можно обьявить так:
function CWpoc (nCode:Integer;fc: Boolean; pMsg: PCWPSTRUCT): LRESULT; stdcall;
begin
if Assigned (pMsg) and
(WM_SYSCOMMAND = pMsg.message) and
(SC_MINIMIZE = pMsg) then
PostMessage (form1.Handle, WM_USER + 3234, 0, 0);
result := CallNextHookEx (hhk, nCode, Integer (fc), Integer (pMsg));
end;
Сообщение WM_USER + 3234 обрабатывать в форме по усмотрению...
Digitman (2005-07-06 12:43:00) [4]
> Игорь Шевченко © (06.07.05 12:39) [14]
> SC_MINIMIZE (SC_MAXIMIZE, SC_RESTORE) посылаются с помощью
> SendMessage
кем ?
Игорь Шевченко (2005-07-06 12:39:00) [5]alpet © (06.07.05 12:33) [13]
> Гарантии того что WM_SYSCOMMAND будет отправлено с помощью
> SendMessage нет.
SC_MINIMIZE (SC_MAXIMIZE, SC_RESTORE) посылаются с помощью SendMessage
alpet (2005-07-06 12:33:00) [6]1. Ты пропускаешь сообщения попадающие в очередь потока с использованием этого хука, в случае Win9x/ME. Гарантии того что WM_SYSCOMMAND будет отправлено с помощью SendMessage нет.
2. Структура по адресу lParam вообще-то не TMsg.
lParamPointer to a CWPSTRUCT structure that contains details about the message
3. Ты опять не разобрался что есть ху. Сообщение надо отлавливать WM_SYSCOMMAND, код SC_MINIMIZE которого вообще приходится на wParam.
cosinus (2005-07-06 11:53:00) [7]
> Digitman © (06.07.05 11:36) [11]
Я знаю об этом и я, к сожалению, не понимаю, что вы хотите мне этим сказать. Не могли бы немного разжевать? Если вы про работоспособность хука, так он работает отлично, а если вы про что то типа "если мы отловили сообщение посланное SendMessage, то отсюда очень легко найти дискриптор окна получателя", то я как раз и не знаю этого "легко".
Digitman (2005-07-06 11:36:00) [8]
> cosinus © (06.07.05 11:29) [10]
> Хук WH_CALLWNDPROC.
The WH_CALLWNDPROC and WH_CALLWNDPROCRET hooks enable you to monitor messages sent to window procedures by the SendMessagefunction
cosinus (2005-07-06 11:29:00) [9]Хук
WH_CALLWNDPROC.
Мне не надо отобразить msgbox, это я просто воткнул для отладки. Если бы надо было, то я бы именно так и сделал. Да, окно абсолютно точно находится и находится правильно, потому что я сверяю дескриптор, полученный при поиске и дескриптор, полученный мною с помощью внешней программы - они идентичны.
alpet (2005-07-06 11:05:00) [10]Судя по всему WH_SYSMSGFILTER. Если тебе надо еще и msgbox отобразить - отсылай окну своей программы пользовательское сообщение, что она и выводила его. И еще: ты уверен что находится окно?
Игорь Шевченко (2005-07-06 10:40:00) [11]cosinus © (06.07.05 10:11) [7]
По сабжу я уже сказал в первом посте.
Какого типа хук ты устанавливаешь ?
cosinus (2005-07-06 10:11:00) [12]
> Игорь Шевченко © (06.07.05 10:05) [6]
Почему? Из-за возможности "бесконечных" вызовов?
А по сабжу ничего не подскажите?
Игорь Шевченко (2005-07-06 10:05:00) [13]Нельзя в хуках вызывать MessageBox
cosinus (2005-07-06 09:23:00) [14]Сорри... Неправильно...
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
Hnd:HWND;
Wnd:HWND;
FWnd:HWND;
begin
if TMsg(Pointer(lParam)^).message=SC_MINIMIZE then
begin
Wnd:=###### //здесь надо найти дискриптор окна получателя
Hnd:=FindWnd(FindText); //Ищем нужное окно по неполному названию
MessageBox(0, PChar(IntToStr(wnd)+#$0a+#$0d+IntToStr(hnd)), 'Message', 0);//тестовая строчка
if (Wnd=Hnd) then
begin
FWnd:=findwindow(nil,'MyAppCaption');// ищем окно нашего приложения
if FWnd<>0 then
PostMessage(FWnd,WM_NOTIFYMINIMAZEAPP,0,0);
end;
end;
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;
cosinus (2005-07-06 09:22:00) [15]
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
Hnd:HWND;
Wnd:HWND;
FWnd:HWND;
begin
if TMsg(Pointer(lParam)^).message=SC_MINIMIZE then
begin
Wnd:=###### //здесь надо найти дискриптор окна получателя
Hnd:=FindWnd(FindText); //Ищем нужное окно по неполному названию
MessageBox(0, PChar(IntToStr(wnd)+#$0a+#$0d+IntToStr(hnd)), 'Message', 0);//тестовая строчка
if (Wnd=Hnd) then
begin
FWnd:=findwindow(nil,'MyAppCaption');// ищем окно нашего приложения
if FWnd<>0 then
PostMessage(findwindow(nil,'SSSS'),WM_NOTIFYMINIMAZEAPP,0,0);
end;
end;
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;
alpet (2005-07-05 19:27:00) [16]1. SC_MINIMIZE применимо лишь как код в параметре wParam для сообщения WM_SYSCOMMAND, это отнюдь не сообщение.
2. Какую ловушку ты устанавливаешь? Код можно глянуть?
cosinus (2005-07-05 18:28:00) [17]В том то и дело, что я не понимаю, как его найти.
В hook-е я отлавливаю SC_MINIMAZE, а потом мне необходимо сверить, то ли это окно, которое мне нужно. Единственное, что я нашел этоMsg(Pointer(lParam)^).hwnd, но этотhwndявно не тот, который мне нужен, потому что
а) Он динамически изменяется
б) Не совпадает сhwnd, нужным мне
в) По-моему для окна верхнего уровня он великоват(но это по незнанию может казаться)
В HELP-е вообще ничего нет, про то, что заhwndвTMsg.
Игорь Шевченко (2005-07-05 18:04:00) [18]по hwnd