Здравствуйте, Vis, Вы писали:
Vis>Возможно ли сделать свое окно(полупрозрачное) которое размещено поверх все окон в системе, включая те, которіе имею флаг WS_EX_TOPMOST?
Vis>С полупрозрачностью. проблема отчасти решена.
Vis>А что делать с расположением? Vis>Как окну удерживать себя поверх всех окон?
Хм, не уверен, что такая возможность существует. Topmost-окна — это окна, которые в Z-Order всегда поддерживаются выше, чем Nontopmost. И все. Но если пользователь переключится на (активизирует) другое topmost-окно, оно окажется "выше всех". Т.е. мое личное мнение — скорее всего нельзя (в общем случае). Но, возможно, есть другие мнения?
Здравствуйте, odisseyLM, Вы писали:
Vis>>Как окну удерживать себя поверх всех окон? LM>Таймер + SetWindowPos LM>Но пользователи тебе за это спасибо не скажут, может даже корпич пообещают кинуть
Да, действительно, это работает! Но способ и впрям извратный Конечно, такие фокусы трудно назвать "хорошим стилем". Но прикольно, да...
Здравствуйте, odisseyLM, Вы писали:
Vis>>Как окну удерживать себя поверх всех окон? LM>Таймер + SetWindowPos LM>Но пользователи тебе за это спасибо не скажут, может даже корпич пообещают кинуть
Гы: хорошо смотрятся 2 таких окна, открытых одновременно!
Здравствуйте, SATo, Вы писали:
SAT> Да, действительно, это работает! Но способ и впрям извратный Конечно, такие фокусы трудно назвать "хорошим стилем". Но прикольно, да...
А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, SATo, Вы писали:
SAT>> Да, действительно, это работает! Но способ и впрям извратный Конечно, такие фокусы трудно назвать "хорошим стилем". Но прикольно, да...
E>А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?
Отличное решение, если в системе не более 2х топмост окон, одно из которых ваше
Здравствуйте, ekamaloff, Вы писали: E>А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?
А что, нужно не только поверх всех окон, но еще и фокус удерживать? В варианте с таймером фокус не удерживается, например... Т.е. окно не становится активным, оно просто перемещается поверх всех окон.
Да и нехорошо это, так ограничивать пользователя (нехорошо даже пытаться так ограничивать пользователя ) Например, MS реализовали специальную логику поведения для SetForegroundWindow, чтобы не позволять любому неактивному приложению захватывать ввод, когда пользователь работает с каким-либо другим приложением.
Здравствуйте, 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
Здравствуйте, SATo, Вы писали:
SAT>Здравствуйте, ekamaloff, Вы писали: E>>А если не по таймеру, а по потере фокуса (не совсем корректно, но не знаю как по-другому назвать), т.е. по WM_ACTIVATE?
SAT>А что, нужно не только поверх всех окон, но еще и фокус удерживать?
Нет, фокус удерживать не надо.
надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, SATo, Вы писали:
SAT>>Да и нехорошо это, так ограничивать пользователя (нехорошо даже пытаться так ограничивать пользователя ) Например, MS реализовали специальную логику поведения для SetForegroundWindow, чтобы не позволять любому неактивному приложению захватывать ввод, когда пользователь работает с каким-либо другим приложением.
E>Насчет MS: в msn-месенджере при получении нового письма или входе пользователя выскакивает окошко с сообщением, которое нельзя скрыть никаким образом, в т.ч. переключившись на окно другого приложения. Если б разобраться как оно работает... E>Да и тот же MetaFrame у меня при долгом бездействии выдает сообщение поверх всех окон. Убрать его тоже невозможно.
E>ЗЫ: значит все таки как-то делают? И я уверен что не по таймеру
Это самое обычное TopMost окно. Безо всяких фокусов. Прекрасно скрывается любым другим TopMost окном (если успеете )
Здравствуйте, Vis, Вы писали:
Vis>Нет, фокус удерживать не надо. Vis>надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.
Тут думаю вариант с таймером — самое то. Тем более, в этом случае перерисовывать окно все равно скорее по таймеру будете. Ну и вызывайте SetWindowPos заодно. Хотя я бы посоветовал подумать, действительно ли необходимо это окно постоянно наверх вытягивать. Уж очень это "жоско"
Здравствуйте, SATo, Вы писали:
SAT>Здравствуйте, Vis, Вы писали:
Vis>>Нет, фокус удерживать не надо. Vis>>надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.
SAT>Тут думаю вариант с таймером — самое то. Тем более, в этом случае перерисовывать окно все равно скорее по таймеру будете. Ну и вызывайте SetWindowPos заодно. Хотя я бы посоветовал подумать, действительно ли необходимо это окно постоянно наверх вытягивать. Уж очень это "жостко"
У меня такая идея:
Я заметил, что если
а) есть 2 popup-окна.
б) одно popup-окно является owner-ом другого
то при активации owner-а наверх вылазит и второе окно, которым оно владеет.
И никак его отдельно вниз не запихнуть.
То есть у думаю надо делать так:
Обрабатывать событие активации любого окна, в том числе и чужих процессов.
Как только активное окно поменялось, найти это активное окно и сделать его
owner-ом моео полупрозрачного.
Я считаю, что такой вариант гораздо лучше, чем SetWindowPos.
Здравствуйте, 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.
Hello Vis, you wrote:
> Нет, фокус удерживать не надо. > надо селать окно, такое эже, как полупрозрачное окно FlashGet-а.
Первый же пользователь, который запустит полноэкранное приложение (например игрушку), или решит посмотреть фильм, помянет вас нехорошим словом, а может и предложением. Не нужно так делать.
Лучше предоставьте пользователю возможность ручного вывода окна на самый верх. Например по нажатию горячей клавиши или при наведении и удержанию мышки в опр. зону экрана.
Здравствуйте, Slava Antonov, Вы писали:
SA>Первый же пользователь, который запустит полноэкранное приложение (например игрушку), или решит посмотреть фильм, помянет вас нехорошим словом, а может и предложением. Не нужно так делать.
SA>Лучше предоставьте пользователю возможность ручного вывода окна на самый верх. Например по нажатию горячей клавиши или при наведении и удержанию мышки в опр. зону экрана.
Во истину! TopMost'ность — полезная штука, но лучше с нею не перебарщивать. Если нужно поверх-всех-окно — сделайте. Но тягать его постоянно наверх все-таки не стоит. Представляете, если программеры начнут регулярно этим пользоваться? Очень весело будет наблюдать topmost окна со списками контактов ICQ и MSN, постоянно соревнующиеся быть выше других.