Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как в глобальном хуке определить кому адресовано отловленное 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо