Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.026 c
1-1137416780
sally
2006-01-16 16:06
2006.03.12
Отображение(отрисовка) изображения


2-1140758544
opoloXAI
2006-02-24 08:22
2006.03.12
DB2


15-1139824556
Гарри Поттер
2006-02-13 12:55
2006.03.12
VPN+Outlook+Exchange


2-1140342145
keyser
2006-02-19 12:42
2006.03.12
Сервисы в windows 98 и Me


1-1139300240
rOOse
2006-02-07 11:17
2006.03.12
Обновление Реестра Windows




   Наверх