Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

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

Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.037 c
3-1121767950
Magic
2005-07-19 14:12
2005.08.28
ADO+LIKE (не работает)


14-1123147824
3DxFantastika
2005-08-04 13:30
2005.08.28
Как перевести дату в UNIX-время (формат)


1-1123539701
LeonidB
2005-08-09 02:21
2005.08.28
Подскажите, как заполнить VirtualTreeView.


5-1094451679
Victor
2004-09-06 10:21
2005.08.28
Гибкие линии


1-1123447715
makvell
2005-08-08 00:48
2005.08.28
А как бы поподробнее и на русском узнать...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский