![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как показать тревожное окно поверх окон других приложений. [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? У тебя прога свёрнута в трей/панель задач?