Окно поверх всех окон
От: Vis Украина  
Дата: 08.12.05 21:47
Оценка:
Возможно ли сделать свое окно(полупрозрачное) которое размещено поверх все окон в системе, включая те, которіе имею флаг WS_EX_TOPMOST?

С полупрозрачностью. проблема отчасти решена.

А что делать с расположением?
Как окну удерживать себя поверх всех окон?
Re: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 10:30
Оценка:
Здравствуйте, Vis, Вы писали:

Vis>Возможно ли сделать свое окно(полупрозрачное) которое размещено поверх все окон в системе, включая те, которіе имею флаг WS_EX_TOPMOST?


Vis>С полупрозрачностью. проблема отчасти решена.


Vis>А что делать с расположением?

Vis>Как окну удерживать себя поверх всех окон?


Хм, не уверен, что такая возможность существует. Topmost-окна — это окна, которые в Z-Order всегда поддерживаются выше, чем Nontopmost. И все. Но если пользователь переключится на (активизирует) другое topmost-окно, оно окажется "выше всех". Т.е. мое личное мнение — скорее всего нельзя (в общем случае). Но, возможно, есть другие мнения?
Re: Окно поверх всех окон
От: odisseyLM  
Дата: 09.12.05 12:34
Оценка: 1 (1) :)
Vis>Как окну удерживать себя поверх всех окон?

Таймер + SetWindowPos

Но пользователи тебе за это спасибо не скажут, может даже корпич пообещают кинуть
Re[2]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 12:59
Оценка:
Здравствуйте, odisseyLM, Вы писали:

Vis>>Как окну удерживать себя поверх всех окон?

LM>Таймер + SetWindowPos
LM>Но пользователи тебе за это спасибо не скажут, может даже корпич пообещают кинуть

Да, действительно, это работает! Но способ и впрям извратный Конечно, такие фокусы трудно назвать "хорошим стилем". Но прикольно, да...
Re[2]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 13:10
Оценка:
Здравствуйте, odisseyLM, Вы писали:

Vis>>Как окну удерживать себя поверх всех окон?

LM>Таймер + SetWindowPos
LM>Но пользователи тебе за это спасибо не скажут, может даже корпич пообещают кинуть

Гы: хорошо смотрятся 2 таких окна, открытых одновременно!
Re[3]: Окно поверх всех окон
От: ekamaloff Великобритания  
Дата: 09.12.05 13:10
Оценка:
Здравствуйте, SATo, Вы писали:

SAT> Да, действительно, это работает! Но способ и впрям извратный Конечно, такие фокусы трудно назвать "хорошим стилем". Но прикольно, да...


А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Окно поверх всех окон
От: kero Россия  
Дата: 09.12.05 13:24
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, SATo, Вы писали:


SAT>> Да, действительно, это работает! Но способ и впрям извратный Конечно, такие фокусы трудно назвать "хорошим стилем". Но прикольно, да...


E>А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?


Отличное решение, если в системе не более 2х топмост окон, одно из которых ваше
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 13:31
Оценка:
Здравствуйте, ekamaloff, Вы писали:
E>А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?

А что, нужно не только поверх всех окон, но еще и фокус удерживать? В варианте с таймером фокус не удерживается, например... Т.е. окно не становится активным, оно просто перемещается поверх всех окон.

Да и нехорошо это, так ограничивать пользователя (нехорошо даже пытаться так ограничивать пользователя ) Например, MS реализовали специальную логику поведения для SetForegroundWindow, чтобы не позволять любому неактивному приложению захватывать ввод, когда пользователь работает с каким-либо другим приложением.
Re[5]: Окно поверх всех окон
От: ekamaloff Великобритания  
Дата: 09.12.05 13:41
Оценка:
Здравствуйте, SATo, Вы писали:

SAT>Да и нехорошо это, так ограничивать пользователя (нехорошо даже пытаться так ограничивать пользователя ) Например, MS реализовали специальную логику поведения для SetForegroundWindow, чтобы не позволять любому неактивному приложению захватывать ввод, когда пользователь работает с каким-либо другим приложением.


Насчет MS: в msn-месенджере при получении нового письма или входе пользователя выскакивает окошко с сообщением, которое нельзя скрыть никаким образом, в т.ч. переключившись на окно другого приложения. Если б разобраться как оно работает...
Да и тот же MetaFrame у меня при долгом бездействии выдает сообщение поверх всех окон. Убрать его тоже невозможно.

ЗЫ: значит все таки как-то делают? И я уверен что не по таймеру
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[5]: Окно поверх всех окон
От: Vis Украина  
Дата: 09.12.05 13:46
Оценка:
Здравствуйте, SATo, Вы писали:

SAT>Здравствуйте, ekamaloff, Вы писали:

E>>А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?

SAT>А что, нужно не только поверх всех окон, но еще и фокус удерживать?


Нет, фокус удерживать не надо.
надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.
Re[6]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 13:53
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, SATo, Вы писали:


SAT>>Да и нехорошо это, так ограничивать пользователя (нехорошо даже пытаться так ограничивать пользователя ) Например, MS реализовали специальную логику поведения для SetForegroundWindow, чтобы не позволять любому неактивному приложению захватывать ввод, когда пользователь работает с каким-либо другим приложением.


E>Насчет MS: в msn-месенджере при получении нового письма или входе пользователя выскакивает окошко с сообщением, которое нельзя скрыть никаким образом, в т.ч. переключившись на окно другого приложения. Если б разобраться как оно работает...

E>Да и тот же MetaFrame у меня при долгом бездействии выдает сообщение поверх всех окон. Убрать его тоже невозможно.

E>ЗЫ: значит все таки как-то делают? И я уверен что не по таймеру


Это самое обычное TopMost окно. Безо всяких фокусов. Прекрасно скрывается любым другим TopMost окном (если успеете )
Re[6]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 13:58
Оценка:
Здравствуйте, Vis, Вы писали:

Vis>Нет, фокус удерживать не надо.

Vis>надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.

Тут думаю вариант с таймером — самое то. Тем более, в этом случае перерисовывать окно все равно скорее по таймеру будете. Ну и вызывайте SetWindowPos заодно. Хотя я бы посоветовал подумать, действительно ли необходимо это окно постоянно наверх вытягивать. Уж очень это "жоско"
Re[7]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 13:59
Оценка:
SAT>Это самое обычное TopMost окно. Безо всяких фокусов. Прекрасно скрывается любым другим TopMost окном (если успеете )

Я имел в виду MSN. Про MetaFrame не знаю...
Re[7]: Окно поверх всех окон
От: Vis Украина  
Дата: 09.12.05 14:06
Оценка:
Здравствуйте, SATo, Вы писали:

SAT>Здравствуйте, Vis, Вы писали:


Vis>>Нет, фокус удерживать не надо.

Vis>>надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.

SAT>Тут думаю вариант с таймером — самое то. Тем более, в этом случае перерисовывать окно все равно скорее по таймеру будете. Ну и вызывайте SetWindowPos заодно. Хотя я бы посоветовал подумать, действительно ли необходимо это окно постоянно наверх вытягивать. Уж очень это "жостко"


У меня такая идея:
Я заметил, что если

а) есть 2 popup-окна.
б) одно popup-окно является owner-ом другого

то при активации owner-а наверх вылазит и второе окно, которым оно владеет.
И никак его отдельно вниз не запихнуть.

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

Я считаю, что такой вариант гораздо лучше, чем SetWindowPos.
Re[8]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 14:16
Оценка:
Здравствуйте, Vis, Вы писали:

Vis>То есть у думаю надо делать так:

Vis>Обрабатывать событие активации любого окна, в том числе и чужих процессов.
Vis>Как только активное окно поменялось, найти это активное окно и сделать его
Vis>owner-ом моео полупрозрачного.

Vis>Я считаю, что такой вариант гораздо лучше, чем SetWindowPos.



Ну нет, мне не кажется это лучше:
1. Активное не обязательно будет TopMost. Работаем с, например, вордом, а сбоку привычно так висит панель аськи или мсн. Ворд — активный, но панель — TopMost. Т.е. SetWindowPos все равно придется вызывать.
2. При закрытии окна owner система закроет и все его owned окна. Лишний гемор отслеживать еще и закрытие.
3. Самое главное (RTFM MSDN): After creating an owned window, an application cannot transfer ownership of the window to another window.
Re[6]: Окно поверх всех окон
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 09.12.05 15:59
Оценка: +1
Hello Vis, you wrote:

> Нет, фокус удерживать не надо.

> надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.

Первый же пользователь, который запустит полноэкранное приложение (например игрушку), или решит посмотреть фильм, помянет вас нехорошим словом, а может и предложением. Не нужно так делать.

Лучше предоставьте пользователю возможность ручного вывода окна на самый верх. Например по нажатию горячей клавиши или при наведении и удержанию мышки в опр. зону экрана.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re[7]: Окно поверх всех окон
От: SATo Россия  
Дата: 09.12.05 20:05
Оценка: :)
Здравствуйте, Slava Antonov, Вы писали:

SA>Первый же пользователь, который запустит полноэкранное приложение (например игрушку), или решит посмотреть фильм, помянет вас нехорошим словом, а может и предложением. Не нужно так делать.


SA>Лучше предоставьте пользователю возможность ручного вывода окна на самый верх. Например по нажатию горячей клавиши или при наведении и удержанию мышки в опр. зону экрана.


Во истину! TopMost'ность — полезная штука, но лучше с нею не перебарщивать. Если нужно поверх-всех-окно — сделайте. Но тягать его постоянно наверх все-таки не стоит. Представляете, если программеры начнут регулярно этим пользоваться? Очень весело будет наблюдать topmost окна со списками контактов ICQ и MSN, постоянно соревнующиеся быть выше других.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.