Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как найти Handle окна сообщения ShowMessage ?


HandleFinder ©   (2005-12-17 18:29:00) 

Дано:

procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage('WWW'+'  '+s);
end;

Использовать FindWindow,GetActiveWindow нельзя - окно с таким именем может существовать, и оно может быть не активным.
Нужно искать от хендла формы или апплета.
Как это сделать?


HandleFinder   (2005-12-19 17:16:00) [1]

>Вообще-то, так не очень хорошо, т.е., по таймеру.

Таймер только для отладки, а так оно одноразовое.


Leonid Troyanovsky   (2005-12-19 16:55:00) [2]


> HandleFinder   (19.12.05 16:41) [3]

> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
>   if h1<>0 then MoveWindow(h1,100,100,100,100,TRUE);
> end;


Вообще-то, так не очень хорошо, т.е., по таймеру.
Лучше б что-то одноразовое, иначе надо следить
за тем, что окно диалога не разрушилось.

Например, h1 : HWND - поле формы, в обработчике WM_USER
заполняем его Screen.ActiveForm.Handle, а где-нибудь в
Screen.OnActiveFormChange? - обнуляем (вместе с таймером).

Поэтому, для таких вещей лучше сделать свою форму.
Или сабклассировать окно диалога.

--
Regards, LVT.


HandleFinder   (2005-12-19 16:41:00) [3]

Сделал:


type
 TForm1 = class(TForm)
   Timer1: TTimer;
   ListBox1: TListBox;
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
   procedure SM(var Msg: TMessage); message WM_USER;
 public
   { Public declarations }
 end;

var   Form1: TForm1;   h1:hwnd ;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if h1<>0 then MoveWindow(h1,100,100,100,100,TRUE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 PostMessage(Form1.Handle, WM_USER,0,0);
 ShowMessage('www');
end;

procedure TForm1.SM (var Msg: TMessage);
begin
 h1:= Screen.ActiveForm.Handle;
end;


Leonid Troyanovsky   (2005-12-19 10:22:00) [4]


> HandleFinder   (17.12.05 18:29)  

> Как это сделать?


Например, узнать Active(Custom)Form обработчика WM_USER формы,
(из которой показывают SM) путем PostMessage(Handle, WM_USER, ..)
_перед_ ShowMessage.

Хотя, вместо SM проще сделать свою форму, снабдив ее недостающей
функциональностью.

--
Regards, LVT.


Digitman   (2005-12-19 10:18:00) [5]


> Нужно искать от хендла формы или апплета


класс окна, создаваемого при вызове ф-ции Showmessage - TMessageForm

родительским для этого окна является окно, созданное объектом TApplication

от этого и следует оталкиваться

если в некий момент времени существует более одного TMessageForm-окна, созданного вызовом ShowMessage(),  с одинаковым текстом в клиентской области, то идентифицировать каждое из них невозможно - требуются дополнительные признаки идентификации


Наверх

Титульная страница Поиск, карта сайта Написать письмо