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

Вниз

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

 
AVT ©   (2002-03-13 17:54) [0]

Привет всем!

Есть до неприличия избитый вопрос: как поднять окно своего приложения поверх всех окон (win2k). Все примеры из win98 не работают.

Есть просто форма и на ней таймер (1 сек.). В таймере надо просто поднять окно. Перепробовал кучу вариантов, в т.ч.:
1.
procedure TForm1.Timer1Timer(Sender: TObject);
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;
2.
procedure TForm1.CreateParams(var CreateParams: TCreateParams);
begin
inherited CreateParams(CreateParams);

CreateParams.ExStyle := CreateParams.ExStyle or WS_EX_TOPMOST;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.SetFocus;
end;

3.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.Restore;
Application.BringToFront;
end;

4.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ShowWindow(Handle, sw_ShowNormal);
SetWindowPos(Handle, HWND_TOP, 0,0,0,0,
SWP_NOSIZE or SWP_NOMOVE);

end;

5. FormStyle = StayOnTop
и т.д.

1, 3 – мигает кнопка на панели задач;
2, 5 – она всегда наверху (так нельзя);
4 – никаких вообще движений.

Заранее благодарен.

AVT.


 
Song ©   (2002-03-13 18:02) [1]

Как делаю я. Но насчёт w2k не уверен.

procedure TForm21.FormShow(Sender: TObject);
Var Rect:TRect;
begin
GetWindowRect(Handle,Rect);
SetWindowPos(Handle,HWND_TOPMOST,Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-Rect.Top, SWP_SHOWWINDOW);
end;

в 98 100% выводится поверх ВСЕХ окон.


 
Song ©   (2002-03-13 18:07) [2]

а на Timer1Timer поставь следующее:
With Form1 Do IF Visible then RePaint else Show;


 
AVT ©   (2002-03-13 19:15) [3]

Все это я уже пробовал. Не помогает.


 
Song ©   (2002-03-13 21:00) [4]

Странно, AVT этот код работает у меня всегда хорошо. Приглядись к параметрам SetWindowPos, может у тебя хоть один отличается и уже получаться не будет или наоборот попробуй поиграть с ними, измени может получиться.


 
AVT ©   (2002-03-13 22:51) [5]

Возможно под win98 это работает, но в win2k нет. Кстати под win98 отлично работает ф-я SetForegroundWindow.
Результат выполнения твоего кода под win2k - всегда висящее окно, как при StayOnTop. А мне надо чтобы окно поднималось поверх всех окон и становилось активным (даже если оно было свернуто). И наоборот, пользователь мог его перекрыть другим окном.


 
Suntechnic ©   (2002-03-14 03:25) [6]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1015610684&n=0


 
Song ©   (2002-03-14 08:36) [7]

Ну вот :)) тебе же такой код и посоветовали, откуда ты брал его в своём вопросе, да?
ну смотри:
попробуй добавить ShowWindow(Hadle,SW_RESTORE);
Выполнение этой функции приведёт к тому, что твоё окно выведется в активное (но не обязательно верхнее) окно. Если оно было минимизировано, то оно выйдёт на верх.
А потом попробую делать любое из действий, что тебе уже посоветовали.


 
Slonic ©   (2002-03-14 09:52) [8]

а пробывал выстовлять formStyle:=fsStayOnTop :)) всегда помогает :))


 
Slonic ©   (2002-03-14 09:59) [9]

Опять таки это можно делать по когда угодно менять formstyle fsNormal на fsStayOnTop и наоборот :)))


 
Varcom   (2002-03-14 11:44) [10]

У меня в приложении, для главной формы:
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
SetForegroundWindow(Handle);
Application.Restore;
Наверх выплывет - точно, и не будет все время торчать сверху. Только не могу точно сказать, передастся ли при этом фокус приложению. Попробуй еще AttachThreadInput.


 
AVT ©   (2002-03-14 21:22) [11]

Всем большое спасибо за участие в решении моей проблемы.
Вот код который поднимает окно поверх всех остальных в win2k(только если оно перекрыто, а не свернуто).

procedure TForm1.Timer1Timer(Sender: TObject);
var tid, wid: WORD;
h: HWND;
begin
h := GetForegroundWindow;

tid := GetCurrentThreadId;
wid := GetWindowThreadProcessId(h, 0);

if tid <> wid then
begin
AttachThreadInput(wid, tid, TRUE);
Windows.SetFocus(Handle);
AttachThreadInput(wid, tid, FALSE);
end;

end;


 
AVT ©   (2002-03-14 21:23) [12]

Тема закрыта.



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

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

Наверх




Память: 0.5 MB
Время: 0.015 c
1-90820
Malder
2002-03-15 19:49
2002.03.28
Русифиация Delphi ресурсов...


1-90971
Surprising
2002-03-15 01:21
2002.03.28
Ограничение по времени работы программы


1-90945
Yulik
2002-03-14 13:05
2002.03.28
Excel


3-90789
Rub
2002-03-04 11:02
2002.03.28
Как програмно послать почту по русски??? Помогите плиз!!!


1-90836
lipskiy
2002-03-15 15:23
2002.03.28
TWebBrowser: как программно подсунуть ему ссылку на выполнение кода в самой программе?