Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
ВнизКак показать тревожное окно поверх окон других приложений. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.073 c