Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Как найти Handle окна сообщения ShowMessage ?   Найти похожие ветки 

 
HandleFinder   (2005-12-17 18:29) [0]

Дано:

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

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


 
Digitman ©   (2005-12-19 10:18) [1]


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


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

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

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

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


 
Leonid Troyanovsky ©   (2005-12-19 10:22) [2]


> HandleFinder   (17.12.05 18:29)  

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


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

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

--
Regards, LVT.


 
HandleFinder   (2005-12-19 16:41) [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 16:55) [4]


> 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 17:16) [5]

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.044 c
11-1121177748
kukuks
2005-07-12 18:15
2006.03.12
Пример программы с unicode


2-1140456200
13
2006-02-20 20:23
2006.03.12
Время затраченное на поиск файлов


15-1140181761
Mirror
2006-02-17 16:09
2006.03.12
Jpeg2000


1-1139573384
DevBoy
2006-02-10 15:09
2006.03.12
Borland отказывается от дальнейшего развития Delphi!


3-1137996955
W
2006-01-23 09:15
2006.03.12
Кодировка таблиц *.dbf