Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];

Вниз

Как поднять окно своего приложения поверх всех окон в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
1-91001
Gayrus
2002-03-02 16:06
2002.03.28
Components


1-90978
Sam3D
2002-03-13 14:37
2002.03.28
Отладка в условиях нехватки ресурсов


3-90745
Sewix
2002-02-28 21:29
2002.03.28
импорт из Word


4-91104
OGR
2002-01-27 23:23
2002.03.28
Как использовать функцию PrintWindow?


1-90990
sdn
2002-03-15 10:39
2002.03.28
MDI Application





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский