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

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

Как показать тревожное окно поверх окон других приложений. [D5, Win95/98]


LLL ©   (2002-03-08 21:04:00) 

Моё приложение выходит на передний план во главе
с предупреждающим окном, но
в неактивном состоянии. И переходит в таковое
только после клика мышки на окне.
Это не удобно - юзер не может
нажатием кнопки подтвердить уведомление.

Достигаю этого след. кодом.

procedure TForm1.Timer1Timer(Sender: TObject); // иммитация аварии
begin
ShowWindow(Application.Handle,SW_NORMAL);
SetForegroundWindow(Application.Handle);
Timer1.Enabled:=False;
Form2.ShowModal; // это и есть предупр. окно
Timer1.Enabled:=TRUE;
end;

Весь внимания.


LLL   (2002-03-12 19:29:00) [1]

> reonid.
Спасибо!
Не совсем устойчиво срабатывает,
но нормально!
Спасибо Всем!


Arhelon   (2002-03-12 08:45:00) [2]

У мня сделано так
procedure TfMain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle:=Params.ExStyle or WS_EX_TOPMOST;
end;
потом когда те надо отобразить своё приложение делаешь
на главную форму SetFocus, а ужо потом Form2.ShowModal
Думаю должно прокатить


Suntechnic   (2002-03-12 07:12:00) [3]

>LLL (11.03.02 21:12)
>Но, окно появляется в неактивном состоянии, если в данный момент
активно другое приложение...

Это специфика работы SetForegroundWindow для Win200. Она несколько отличается от Win98. Обойти это можно различными способами. Или так как советовал reonid © (11.03.02 21:39) или используя AttachThreadInput заставить свой поток "поучавствовать" в механизмах ввода и вызвать там SetForegroundWindow и затем ещё раз AttachThreadInput с последним параметром FALSE


reonid   (2002-03-11 21:39:00) [4]

Попробуй так:


var
OldTimeOut: DWORD;
hWnd: Integer;
begin
hWnd := GetForegroundWindow;
if hWnd = Handle then Exit;
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @OldTimeOut, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(000), 0);
SetForegroundWindow(Handle);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(OldTimeOut), 0);
end;


LLL   (2002-03-11 21:12:00) [5]

> Song
Сделал так.
Unit1

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=False;
Form2.ShowModal;
Timer1.Enabled:=TRUE;
end;

procedure TForm2.CreateParams( var Params: TCreateParams );
begin
inherited CreateParams( Params );
with Params do
begin
WndParent:=0; // чтобы появлялось только это одно окно.
end;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
SetForegroundWindow(Handle); // сделал как вы советовали.
end;

Но, окно появляется в неактивном состоянии, если в данный момент
активно другое приложение.Как мне сделать активным моё окно?


Anatoly Podgoretsky   (2002-03-09 10:18:00) [6]

Timer1.Enabled:=False; //таймер временно выключен
Form2.ShowModal; //это произойдёт !!! (таймер не мешает)
Timer1.Enabled:=TRUE; //этого тоже произойдёт

Иожет стоило проверитьЮ прежде чем советовать, книжки почитать


Song   (2002-03-09 10:11:00) [7]

2KvORubin
Почему Вы так думаете? Почему не произойдёт Timer1Timer??? Вы ведь не видели его начальное значение! Я уверен, что на TForm1.Create LLL поставил Timer1.Enabled:=True


KvORubin   (2002-03-09 09:58:00) [8]

procedure TForm1.Timer1Timer(Sender: TObject); begin
...
...
Timer1.Enabled:=False; //таймер безповоротно выключен !!!
Form2.ShowModal; //этого не произойдёт !!! (таймер выключен)
Timer1.Enabled:=TRUE; //этого не произойдёт !!! (если только из другой процедуры)

end;


Song   (2002-03-09 08:59:00) [9]

Способов много. Кроме вышеупомянутого SetForeGroundWindow есть ещё BringToFront, SetActiveWindow,SetWindowPos.

ИМХО, а ошибка у тебя в том, что SetForegRoundWindow нужно ставить на onShow того окна, которое выскакивает с тревогой т.е. как я понял - форма2.

А зачем ты делаешь ShowWindow? У тебя прога свёрнута в трей/панель задач?


Наверх

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