Текущий архив: 2006.10.29;
Скачать: CL | DM;
Вниз
надо перехватить окно в модальном режиме Найти похожие ветки
← →
chizra © (2006-06-03 20:01) [0]Привет! Мне надо перехватить окно в модальном режиме.
То есть я загружаю библиотеку вызываю из нее процедуру,
которая что-то делает и показывает окно в модальном режиме;
как бы вернуть результат mrOk не показывая это окно. Я уже
поставил ловушку типа WH_CALLWNDPROC.
Какое сообщение надо ловить, если это можно сделать
через перехват сообщений?
← →
antonn © (2006-06-03 20:03) [1]окно чье? в смысле библиотека чужая?
← →
chizra © (2006-06-03 21:05) [2]Да, библиотека чужая.
← →
Lab74 © (2006-06-03 23:40) [3]Вопрос на самом деле интересный.
А именно, как произвести для посторонней программы эффект, равносильный нажатию Enter в ее окне, но при этом окно не выводить (предотвратить вывод).
Возможно ли это вообще средствами WinAPI?
А любыми средствами?
← →
Leonid Troyanovsky © (2006-06-04 10:20) [4]
> Lab74 © (03.06.06 23:40) [3]
> Вопрос на самом деле интересный.
И чего в нем интересного?
--
Regards, LVT.
← →
Lab74 © (2006-06-04 11:19) [5]Интерес в том, что мне (и не только мне) это нужно, а как сделать - непонятно.
Может, я задачу не совсем ясно определил?
Еще раз: есть посторонняя программа, которая выводит дочернее (модальное) окно. Задача: перехватить попытку вывода этого окна, предотвратить его вывод, и еще кое-что сделать (что? в этом как раз и вопрос), чтобы эта посторонняя программа думала, что она вывела свое дочернее окно как положено и пользователь нажал в нем на OK.
Ты знаешь как это сделать?
← →
Leonid Troyanovsky © (2006-06-04 11:31) [6]
> Lab74 © (04.06.06 11:19) [5]
> Интерес в том, что мне (и не только мне) это нужно, а как
> сделать - непонятно.
Мне же оно не нужно, хотя мне понятно, как это сделать.
Какой же тут может быть интерес?
http://groups.google.com/group/fido7.ru.delphi/msg/e574b451a522c210
--
Regards, LVT.
← →
Lab74 © (2006-06-04 11:45) [7]В том примере окно сначала выводится, а потом в нем нажимается кнопка. С этим нет проблем.
Вопрос состоит в том, как предотвратить вывод этого окна. А родительская программа должна думать, что она его вывела и пользователь нажал там кнопку ОК ...
← →
Leonid Troyanovsky © (2006-06-04 11:50) [8]
> Lab74 © (04.06.06 11:45) [7]
> В том примере окно сначала выводится, а потом в нем нажимается
> кнопка. С этим нет
The WM_INITDIALOG message is sent to the dialog box procedure immediately before a dialog box is displayed.
--
Regards, LVT.
← →
Lab74 © (2006-06-04 12:16) [9]Но кнопку ты в диалоге нажимаешь до того, как он отобразится или все-таки после?
Понятно, что в прямом смысле невозможно нажать кнопку до того, как она отобразится :) Поэтому я и поставил вопрос так
> как произвести для посторонней программы эффект, равносильный
> нажатию Enter в ее окне, но при этом окно не выводить (предотвратить
> вывод)
> есть посторонняя программа, которая выводит дочернее (модальное)
> окно. Задача: перехватить попытку вывода этого окна, предотвратить
> его вывод, и еще кое-что сделать (что? в этом как раз и
> вопрос), чтобы эта посторонняя программа думала, что она
> вывела свое дочернее окно как положено и пользователь нажал
> в нем на OK
> Вопрос состоит в том, как предотвратить вывод этого окна.
> А родительская программа должна думать, что она его вывела
> и пользователь нажал там кнопку ОК
← →
Leonid Troyanovsky © (2006-06-04 12:19) [10]
> Lab74 © (04.06.06 12:16) [9]
> Но кнопку ты в диалоге нажимаешь до того, как он отобразится
> или все-таки после?
Столько много постов, вместо того, чтобы скомпилировать и
испытать показанный код.
Дабы обсуждать нечто конкретное.
--
Regards, LVT.
← →
Lab74 © (2006-06-04 12:54) [11]OK, извини что не попробовал. Может, действительно, все просто. Но скомпилировать смогу только послезавтра, сейчас должен уезжать. Извини за перерыв в дискуссии.
← →
Lab74 © (2006-06-06 23:06) [12]
> Leonid Troyanovsky
Попробовал. Очень добротный код, все сразу как положено откомпилировалось. Спасибо.
Но, как я и предполагал, события развиваются в следующем порядке:
1) сначала на экран выводится диалоговое окно;
2) кнопке ОК посылается сообщение BM_CLICK;
3) окно захлопывается.
Мой вопрос же был в том, можно ли вообще предотвратить вывод этого диалогового окна?
← →
chizra © (2006-06-07 08:34) [13]У меня тоже самое.
Перехватить удается, но модальное окно все таки на доли секунды появляется.
А как сделать чтобы оно совсем не появлялось?
код прог-мы:
...
sethook(true, GetCurrentThreadId);
//здесь загружается dll и вызывается процедура из чужой dll, которая выводит модальное окно
sethook(false,0);
end.
Вот процедуры для установки hooka на свой поток:
var
H_hook:THandle;
function HookProc(code:integer; wParam:word; lParam:longword): longint; stdcall;
var
BoxWnd:HWND; // дискриптор модального окна
// Pch:Pchar;
ch:array [0..max_path] of char;
st:string;
begin
if code < 0 then
begin
Result:= CallNextHookEx(H_hook, Code, wParam, lParam);
Exit;
end;
PngWnd:=PCWPStruct(lParam)^.hwnd;
if (PCWPStruct(lParam)^.message=WM_PAINT) or (PCWPStruct(lParam)^.message=WM_SHOWWINDOW)
or (PCWPStruct(lParam)^.message=WM_INITDIALOG) then
// if Lo(PCWPStruct(lParam)^.lParam)=WA_ACTIVE then
begin
GetWindowText(BoxWnd,ch,max_path);
st:=ch;
if Trim((st))="Caption" then // "Caption" - текст в заголовке модального окна
begin
Result:=0;
htemp:=0;
htemp:=FindWindowEx(BoxWnd,0,"Button","OK");
if htemp<>0 then
begin
PostMessage(htemp, BM_CLICK,0,0);
end;
// EndDialog(BoxWnd, idOK );
exit;
end;
end;
Result:= CallNextHookEx(H_hook, Code, wParam, lParam);
end;
procedure sethook(param:boolean;ThId:longword);stdcall;
begin
if param then
H_hook:=SetWindowsHookEx({WH_GETMESSAGE}WH_CALLWNDPROC,@HookProc, hInstance, ThId )
else
UnHookWindowsHookEx(H_hook);
end;
← →
Сергей М. © (2006-06-07 09:33) [14]Задача в общем случае не имеет решения - режим модальности для диалогового окна может попросту эмулироваться, как это сделано, например, в TCustomForm.ShowModal
← →
Lab74 © (2006-06-07 12:52) [15]> Сергей М.
а если отвлечься от того, что окно модальное?
т.е. посторонняя программа просто собирается вывести окно, в котором пользователь должен нажать ОК.
Задача: предотвратить вывод этого окна, но так, чтобы эта посторонняя программа "думала", что она вывела это окно и пользователь нажал там ОК.
(Предположим, никаких заморочек с проверками на реальное нажатие клавиш и т.п. ухищрений не производится.)
Может как-то можно с непосредственно с памятью процесса поработать, чтобы решить эту задачу? А может и более простые методы есть?
← →
Сергей М. © (2006-06-07 13:08) [16]
> Lab74 © (07.06.06 12:52) [15]
Можно попробовать перехватить вызов CreateWindow[Ex] с целью сброса флага WS_VISIBLE в параметре Flags и после этого послать этому окну сообщение BM_CLICK для интересующей кнопки.
← →
Leonid Troyanovsky © (2006-06-12 22:37) [17]
> Lab74 © (06.06.06 23:06) [12]
> 1) сначала на экран выводится диалоговое окно;
> 2) кнопке ОК посылается сообщение BM_CLICK;
> 3) окно захлопывается.
Не совсем так.
Как уже упоминалось ранее, WM_INITDIALOG посылается
непосредственно перед показом диалога.
Существует, конечно, вероятность, что посланный кнопке
клик обработается уже после показа (хотя, в нашем случае
с блокнотом, я такого не наблюдал в NT4, 5, w2k3).
С другой стороны, есть еще SendMessage, и, кроме того,
нет нужды посылать BM_CLICK, а лучше слать паренту
кнопки WM_COMMAND с нужным идентификаторм.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2006.10.29;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.031 c