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

Вниз

Окно поверх всех окон   Найти похожие ветки 

 
DJ Kondakov   (2008-04-22 14:57) [0]

Как сделать окно поверх всех окон в системе вообще? Насколько я знаю, FormStyle := fsStayOnTop делает окно поверх только остальных окон приложения.


 
DVM ©   (2008-04-22 14:58) [1]

никак


 
DJ Kondakov   (2008-04-22 15:00) [2]

А Винамп же как-то это делает?!


 
DVM ©   (2008-04-22 15:01) [3]


> А Винамп же как-то это делает?!

из двух винампов один все же ниже другого


 
DJ Kondakov   (2008-04-22 15:02) [4]

Не понял...


 
DVM ©   (2008-04-22 15:03) [5]


> Не понял...

окно не может быть всегда выше всех других окон ибо всегда найдется другое такое окно кторое тоже хочет быть выше


 
DVM ©   (2008-04-22 15:07) [6]

Попытаться удержаться наверху как можно дольше можно используя SetWindowPos(...., HWND_TOPMOST) + обработку сообщения WM_WINDOWPOSCHANGING


 
Anatoly Podgoretsky ©   (2008-04-22 15:40) [7]

> DVM  (22.04.2008 15:07:06)  [6]

Да ладно не мучайся, просто запусти два экземпляра и попробуй осуществить свою мечту.


 
DVM ©   (2008-04-22 15:44) [8]


> Anatoly Podgoretsky ©   (22.04.08 15:40) [7]


> попробуй осуществить свою мечту.

Мою мечту???


 
Алексей К.   (2008-04-24 09:47) [9]

используй таймер.
т.е. при каждом срабатывании таймера (например, с интервалом в 1 сек или меньше) просто вызывай SetWindowPos(..., HWND_TOPMOST...)

как-то я писал прогу типа локера, так вот этой штукой и спасалсо.
ЗЫ
такое окно и диспетчер задач будет загораживать собой ;)


 
{RASkov} ©   (2008-04-24 11:16) [10]

> [9] Алексей К.   (24.04.08 09:47)
> такое окно и диспетчер задач будет загораживать собой ;)

Ну а из двух таких окон - кто царь горы? :)


 
{RASkov} ©   (2008-04-24 11:19) [11]

....т.е. даже не обязательно это будут приложения одного автора, а разных... двух разных и больных авторов :)

Это "хорошо" еще секунда или более, не так эфектно, а если меньше интервал.... во борьба начнется :)


 
Дмитрий С   (2008-04-24 17:34) [12]


> DVM ©

+ вычисление конкурентов и TerminateProcess :)


 
Dmitry S ©   (2008-04-24 23:48) [13]

Устраиваем турнир!
Желающие, пишите программу для удержания окна выше остальных. Победит та программа, чье окно окажеться выше всех.
Порядок запуска процессов выбирается случайно.

Окно должно быть любого цвета с различимой надписью: имя участника.

Условие: Касперский запущенный на всю катушку не должен паниковать по поводу методов удержания окна.

Заодно и выясним=)


 
DVM ©   (2008-04-25 10:39) [14]


> Dmitry S ©   (24.04.08 23:48) [13]

В конкурсе участвуют окна, распечатанные на принтере?


 
{RASkov} ©   (2008-04-25 12:45) [15]

> [14] DVM ©   (25.04.08 10:39)
> В конкурсе участвуют окна, распечатанные на принтере?

Могут, только участовавать будут в своей весовой категории...
Кто первый прелипил, тот и проиграл...
:о)


 
DVM ©   (2008-04-25 13:03) [16]


> {RASkov} ©   (25.04.08 12:45) [15]

Тогда я предлагаю проецировать изображение окна с помощью проектора на поверхность экрана монитора. И пусть кто-нибудь попробует его перекрыть.


 
Поп Гапон   (2008-05-06 18:50) [17]

SetWindowPos(Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE OR SWP_NOSIZE OR SWP_SHOWWINDOW);


 
Ins ©   (2008-05-06 19:17) [18]


> Насколько я знаю, FormStyle := fsStayOnTop делает окно поверх
> только остальных окон приложения.

Полагаю, ваша StayOnTop-форма утопает при переключении на другое приложение? Тогда смею предположить, что это неглавная форма, так как с главными такого эффекта не наблюдается. VCL очень хитро обращается с StayOnTop, в частности, этот флажок сбрасывается для всех форм кроме главной при деактивации приложения. Подавить такое поведение можно несколькими способами, я предпочитаю такой. Для формы, которая должна быть StayOnTop перекрываем CreateParams таким образом:

TForm2 = class(TForm)
protected
 procedure CreateParams(var Params: TCreateParams); override;
end;
...

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
 inherited;
 Params.WndParent:=0; // "Отвязываем" форму от Application.Handle
 Params.ExStyle:=Params.ExStyle or WS_EX_TOPMOST;
end;


 
DJ Kondakov   (2008-07-05 09:48) [19]

Хы-хы... Оказывается, в Delphi 10 Lite fsStayOnTop делает форму поверх всех окон в системе... А я мозги компостировал...


 
Тын-Дын ©   (2008-07-07 01:22) [20]

Вот один из методов:

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnIdle := Idle;
end;


procedure TForm1.Idle(Sender: TObject; var DOne: BOolean);
var
 Pt: TPoint;
 R: TRect;
begin
 if Assigned(Form4) then
 begin
   GetCursorPos(Pt);
   R := Rect(Form4.Left,Form4.Top,Form4.Left+Form4.Width,Form4.Top+Form4.Height);
   if not PtInRect(R,pt) then SetWindowPos(Form4.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
 end;
end;


 
Дмитрий Белькевич ©   (2008-07-09 12:35) [21]

>Хы-хы... Оказывается, в Delphi 10 Lite fsStayOnTop делает форму поверх всех окон в системе... А я мозги компостировал..

Выше винампа, надеюсь?


 
brother ©   (2008-07-09 13:27) [22]

никак или через одно место...


 
Тын-Дын ©   (2008-07-09 13:52) [23]


> brother ©   (09.07.08 13:27) [22]
> никак или через одно место...


С чего бы это?


 
DVM ©   (2008-07-09 13:58) [24]


> С чего бы это?

Потому, что не бывает в системе окон выше всех (в отличие от ниже всех). Как в стопке листов не бывает самого верхнего. Всегда сверху можно положить еще лист. Если запустить две копии программы из [20] что начнется? Ерунда будет.


 
Тын-Дын ©   (2008-07-09 14:05) [25]


> DVM ©   (09.07.08 13:58) [24]
>
> > С чего бы это?
>
> Потому, что не бывает в системе окон выше всех (в отличие
> от ниже всех). Как в стопке листов не бывает самого верхнего.
>  Всегда сверху можно положить еще лист. Если запустить две
> копии программы из [20] что начнется? Ерунда будет.


А это обязательно - запускать ещё одну такую программу?


 
brother ©   (2008-07-09 14:09) [26]

> запускать ещё одну такую программу?

а если они обе всеж стартанут?


 
DVM ©   (2008-07-09 14:09) [27]


> А это обязательно - запускать ещё одну такую программу?

Не знаю, но ведь не исключено. Да и не исключено, что из двух совсем разных программ разных авторов обе захотят всегда сидеть наверху. Будет чехарда.


 
Тын-Дын ©   (2008-07-09 14:11) [28]


> DVM ©   (09.07.08 14:09) [27]
>
> > А это обязательно - запускать ещё одну такую программу?
>
>
> Не знаю, но ведь не исключено. Да и не исключено, что из
> двух совсем разных программ разных авторов обе захотят всегда
> сидеть наверху. Будет чехарда.


Достаточно сделать настраиваемой такую возможность...


 
brother ©   (2008-07-09 14:13) [29]

> Достаточно сделать настраиваемой такую возможность...

кому программам разных авторов?)
да не будут они ОБЕ наверху! или будут меняться местмаи с n переодичностью...


 
Тын-Дын ©   (2008-07-09 14:17) [30]


> brother ©   (09.07.08 14:13) [29]
> > Достаточно сделать настраиваемой такую возможность...
>
> кому программам разных авторов?)
> да не будут они ОБЕ наверху! или будут меняться местмаи
> с n переодичностью...


Так сделай свою программу настраиваемой. Кто мешает-то?


 
{RASkov} ©   (2008-07-09 14:18) [31]

Единственное верное решение в этом плане(в плане сабжа) это - TOPMOST, т.е. стиль окна fsStayontop
Другими словами окно будет выше всех и всегда выше тех у кого нет такого стиля, но при "поднятии" другого окна с таким же стилем, то "другое" становится выше всех... Это нормально.


 
brother ©   (2008-07-09 14:23) [32]

> Так сделай свою программу настраиваемой.

а остальные?
в общем согласен с [31]


 
Тын-Дын ©   (2008-07-09 14:35) [33]


> {RASkov} ©   (09.07.08 14:18) [31]
> Единственное верное решение в этом плане(в плане сабжа)
> это - TOPMOST, т.е. стиль окна fsStayontop
> Другими словами окно будет выше всех и всегда выше тех у
> кого нет такого стиля, но при "поднятии" другого окна с
> таким же стилем, то "другое" становится выше всех... Это
> нормально.


Выше приведено второе решение.
При необходимости его можно использовать (и оно используется успешно более года).

При замене параметров создания формы есть некоторые особенности, которые не всегда устраивают - не помню уже какие.


 
Тын-Дын ©   (2008-07-09 14:36) [34]


> {RASkov} ©   (09.07.08 14:18) [31]
> Единственное верное решение в этом плане(в плане сабжа)
> это - TOPMOST, т.е. стиль окна fsStayontop
> Другими словами окно будет выше всех и всегда выше тех у
> кого нет такого стиля, но при "поднятии" другого окна с
> таким же стилем, то "другое" становится выше всех... Это
> нормально.


Кстати, оно даже и неверное для не основной формы приложения.


 
Anatoly Podgoretsky ©   (2008-07-09 14:38) [35]

> Тын-Дын  (09.07.2008 14:17:30)  [30]

Да, да, любых других претедентов на это давить в зародыше, закрывать.


 
Тын-Дын ©   (2008-07-09 14:40) [36]


> Anatoly Podgoretsky ©   (09.07.08 14:38) [35]
> > Тын-Дын  (09.07.2008 14:17:30)  [30]
>
> Да, да, любых других претедентов на это давить в зародыше,
>  закрывать.


При желании;)


 
Renegat   (2008-07-09 14:42) [37]

> [24] DVM ©   (09.07.08 13:58)

Блин, классика форума :)
Чтобы не происходило "священной войны" за первенство на мониторе, нужно всего лишь специальным флагом запретить функции SetWindowPos отсылать уведомления об изменении позиции окна! И тогда наше окно по-тихому обретёт главенство над десктопом %)


 
Anatoly Podgoretsky ©   (2008-07-09 14:55) [38]

> Тын-Дын  (09.07.2008 14:40:36)  [36]

В зародыше.


 
Тын-Дын ©   (2008-07-09 14:56) [39]


> И тогда наше окно по-тихому обретёт главенство над десктопом
> %)

Не-а... Не обретёт.


 
Тын-Дын ©   (2008-07-09 14:57) [40]


> Anatoly Podgoretsky ©   (09.07.08 14:55) [38]
> > Тын-Дын  (09.07.2008 14:40:36)  [36]
>
> В зародыше.


По желанию.



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

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

Наверх




Память: 0.56 MB
Время: 0.017 c
15-1214082477
Поросенок Винни-Пух
2008-06-22 01:07
2008.08.10
3:1


2-1215499214
lewka
2008-07-08 10:40
2008.08.10
HTML - код


4-1192602325
_Guest_
2007-10-17 10:25
2008.08.10
Распознать подключение / отключение флешки


15-1214480023
No_Dead
2008-06-26 15:33
2008.08.10
Игральный кубик


2-1215418440
Irina_GR
2008-07-07 12:14
2008.08.10
QReport