Форум: "WinAPI";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизКак найти 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.013 c