Главная страница
    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.031 c
2-1160408486
лёха
2006-10-09 19:41
2006.10.29
реестр в виндовс


8-1143445304
zxcv
2006-03-27 11:41
2006.10.29
Chart 3D


15-1160046641
saNat
2006-10-05 15:10
2006.10.29
Требуется помощь в настройке сети


4-1150313195
Rules
2006-06-14 23:26
2006.10.29
Определение запуска приложения


15-1159915299
Multy
2006-10-04 02:41
2006.10.29
Ну и что это за уродство?





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