Форум: "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.04 c