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

Вниз

Как показать тревожное окно поверх окон других приложений.   Найти похожие ветки 

 
LLL   (2002-03-08 21:04) [0]

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

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

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

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


 
Song ©   (2002-03-09 08:59) [1]

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

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

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


 
KvORubin ©   (2002-03-09 09:58) [2]

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

end;


 
Song ©   (2002-03-09 10:11) [3]

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


 
Anatoly Podgoretsky ©   (2002-03-09 10:18) [4]

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

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


 
LLL   (2002-03-11 21:12) [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;

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



 
reonid ©   (2002-03-11 21:39) [6]

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


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;


 
Suntechnic ©   (2002-03-12 07:12) [7]

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

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


 
Arhelon ©   (2002-03-12 08:45) [8]

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


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

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




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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
1-80467
kull
2002-03-11 17:42
2002.03.25
Помогите найти программные инструменты для анализа кода!


3-80421
dmitriyk
2002-02-26 03:35
2002.03.25
Почему ПОСЛЕДНЯЯ добавленная запись потом выводится ПЕРВОЙ


1-80618
hooky-mars
2002-03-08 19:36
2002.03.25
DBNavigator


3-80442
Igor_
2002-02-27 13:24
2002.03.25
Где запущена программа?


1-80556
lipskiy
2002-03-08 23:47
2002.03.25
Ошибка clCream is not a valid integer value в Object Inspector - как бороться?