Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Как в глобальном хуке определить кому адресовано отловленное msg?   Найти похожие ветки 

 
cosinus ©   (2005-07-05 17:59) [0]

Что то копаюсь, копаюсь... Никак понять не могу.
Не подскажите?


 
Игорь Шевченко ©   (2005-07-05 18:04) [1]

по hwnd


 
cosinus ©   (2005-07-05 18:28) [2]

В том то и дело, что я не понимаю, как его найти.
В hook-е я отлавливаю SC_MINIMAZE, а потом мне необходимо сверить, то ли это окно, которое мне нужно. Единственное, что я нашел это Msg(Pointer(lParam)^).hwnd, но этот hwnd явно не тот, который мне нужен, потому что
а) Он динамически изменяется
б) Не совпадает с hwnd, нужным мне
в) По-моему для окна верхнего уровня он великоват(но это по незнанию может казаться)
В HELP-е вообще ничего нет, про то, что за hwnd в TMsg.


 
alpet ©   (2005-07-05 19:27) [3]

1. SC_MINIMIZE применимо лишь как код в параметре wParam для сообщения WM_SYSCOMMAND, это отнюдь не сообщение.
2. Какую ловушку ты устанавливаешь? Код можно глянуть?


 
cosinus ©   (2005-07-06 09:22) [4]


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;


 
cosinus ©   (2005-07-06 09:23) [5]

Сорри... Неправильно...

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;


 
Игорь Шевченко ©   (2005-07-06 10:05) [6]

Нельзя в хуках вызывать MessageBox


 
cosinus ©   (2005-07-06 10:11) [7]


> Игорь Шевченко ©   (06.07.05 10:05) [6]
Почему? Из-за возможности "бесконечных" вызовов?
А по сабжу ничего не подскажите?


 
Игорь Шевченко ©   (2005-07-06 10:40) [8]

cosinus ©   (06.07.05 10:11) [7]

По сабжу я уже сказал в первом посте.

Какого типа хук ты устанавливаешь ?


 
alpet ©   (2005-07-06 11:05) [9]

Судя по всему WH_SYSMSGFILTER.  Если тебе надо еще и msgbox отобразить - отсылай окну своей программы пользовательское сообщение, что она и выводила его. И еще: ты уверен что находится окно?


 
cosinus ©   (2005-07-06 11:29) [10]

Хук WH_CALLWNDPROC.
Мне не надо отобразить msgbox, это я просто воткнул для отладки. Если бы надо было, то я бы именно так и сделал. Да, окно абсолютно точно находится и находится правильно, потому что я сверяю дескриптор, полученный при поиске и дескриптор, полученный мною с помощью внешней программы - они идентичны.


 
Digitman ©   (2005-07-06 11:36) [11]


> 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 SendMessage function


 
cosinus ©   (2005-07-06 11:53) [12]


> Digitman ©   (06.07.05 11:36) [11]
Я знаю об этом и я, к сожалению, не понимаю, что вы хотите мне этим сказать. Не могли бы немного разжевать? Если вы про работоспособность хука, так он работает отлично, а если вы про что то типа "если мы отловили сообщение посланное SendMessage, то отсюда очень легко найти дискриптор окна получателя", то я как раз и не знаю этого "легко".


 
alpet ©   (2005-07-06 12:33) [13]

1. Ты пропускаешь сообщения попадающие в очередь потока с использованием этого хука, в случае Win9x/ME. Гарантии того что WM_SYSCOMMAND будет отправлено с помощью SendMessage нет.

2. Структура по адресу lParam вообще-то не TMsg.
lParam Pointer to a CWPSTRUCT structure that contains details about the message

3. Ты опять не разобрался что есть ху. Сообщение надо отлавливать WM_SYSCOMMAND, код SC_MINIMIZE которого вообще приходится на wParam.


 
Игорь Шевченко ©   (2005-07-06 12:39) [14]

alpet ©   (06.07.05 12:33) [13]


> Гарантии того что WM_SYSCOMMAND будет отправлено с помощью
> SendMessage нет.


SC_MINIMIZE (SC_MAXIMIZE, SC_RESTORE) посылаются с помощью SendMessage


 
Digitman ©   (2005-07-06 12:43) [15]


> Игорь Шевченко ©   (06.07.05 12:39) [14]


> SC_MINIMIZE (SC_MAXIMIZE, SC_RESTORE) посылаются с помощью
> SendMessage


кем ?


 
alpet ©   (2005-07-06 13:01) [16]

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 обрабатывать в форме по усмотрению...


 
Игорь Шевченко ©   (2005-07-06 13:15) [17]

Digitman ©   (06.07.05 12:43) [15]

DefWindowProc"ом в Win32k.sys


 
cosinus ©   (2005-07-06 13:16) [18]

У меня получилось вот так...
Вроде нормально.


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;



Страницы: 1 вся ветка

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.05 c
3-1121337642
Ирина
2005-07-14 14:40
2005.08.28
SetField, AppendRecord


1-1122699937
Navi
2005-07-30 09:05
2005.08.28
AutoCAD + Delphi - аргументы для SetXRecordData?


1-1123423392
Андрей Молчанов
2005-08-07 18:03
2005.08.28
DisposePIDL и окно отладчика


1-1123483369
_zx
2005-08-08 10:42
2005.08.28
испльзование компонентов


1-1123122762
Лумер
2005-08-04 06:32
2005.08.28
Как показать две одинаковые формы?