Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.029 c
15-1160573172
novill
2006-10-11 17:26
2006.10.29
Как называется команда в ХР, которая регистрирует библиотеки?


2-1160544824
gvozdkoff
2006-10-11 09:33
2006.10.29
Ключевре поле DB Paradox


2-1160648531
gidd
2006-10-12 14:22
2006.10.29
Получение иконки


15-1160027222
ZeroDivide
2006-10-05 09:47
2006.10.29
Великий заговор Ex-USSR


15-1160494016
Cyrax
2006-10-10 19:26
2006.10.29
Windows XP. Синий экран смерти