Главная страница
    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.5 MB
Время: 0.042 c
15-1160403195
Alien1769
2006-10-09 18:13
2006.10.29
Составление блок-схем


2-1160544905
vigo_
2006-10-11 09:35
2006.10.29
Форма копировать, вставить и пр при нажатии пр. кн. мыши


2-1160389147
Alex Kryuchkov
2006-10-09 14:19
2006.10.29
Уничтожение родительской формы


15-1160116585
Шмель
2006-10-06 10:36
2006.10.29
Выбор монитора


2-1160395203
mahab
2006-10-09 16:00
2006.10.29
WM_VSCROLL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский