Помощь - Поиск - Пользователи - Календарь
Полная версия: Прозрачность окна чужого приложения
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
volvo
Привем всем...

Столкнулся с не совсем понятным поведением своей программы... Дело в следующем: я меняю прозрачность любого видимого окна на десктопе через получение его hWnd и SetLayeredWindowAttributes... Естественно, при закрытии своей программы, я хочу, чтобы все вернулось в первоначальный вид, для чего прохожу по списку окон, для которых прозрачность была изменена мной, и делаю их НЕпрозрачными... Проблема в том, что это (именно восстановление непрозрачности) не работает, если у "чужого" окна установлен стиль TOPMOST... Причем, если я перезапущу программу и уменьшу прозрачность вручную - все работает...

Почему же не срабатывает установление
SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
при закрытии моего приложения? И именно для TopMost окон, остальные же прекрасно обрабатываются... blink.gif
мисс_граффити
Под разными ОСями одно и то же?
volvo
Меня не интересуют разные ОСи... Программа использует функции, доступные ТОЛЬКО в XP (никак не раньше), поэтому оно должно корректно работать именно в XP и выше... Вистой еще не обзавелся (и в ближайшее время не намереваюсь)...
Malice
Немного не понял: т.е. если сделать отдельную кнопку "Восстановить", которая пробежит по измененным окнам и вернет все на место, то работает, а при закрытии тот же код не работает ?
volvo
Нет... Кнопка тоже не отработала для TOPMOST-окон... Для них работает только изменение вручную (я пользуюсь TrackBar-ом)... Ничего не понимаю... Какая разница, КАК и ОТКУДА я вызываю? Это же одна и та же процедура... blink.gif
Bokul
Может ты repaint забываешь вызывать?
Цитата
Почему же не срабатывает установление при закрытии моего приложения?

В msdn советуют убирать прозрачность полностью (устранять стиль WS_EX_LAYERED), а не делать ее нулевой.
Malice
В таком случае, как я понимаю, разница лишь в том, что при TrackBar эта функция вызывается подряд 50 раз пока тянешь, а с конопки только 1 раз.. Может до него не с первого раза доходит? smile.gif Для чистоты эксперимента попробуй в кнопке сделать цикл от текущего значения до 255 через небольшой sleep..
мисс_граффити
Цитата
Может ты repaint забываешь вызывать?

Цитата
Note that you don't need to call RedrawWindow or somesuch after this; SetLayeredWindowAttributes itself causes a redraw.
Гость
А если дважды вызывать
Код

SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
volvo
Значится, так... Во-первых, Bokul, Юля совершенно права - никаких вызовов RePaint я не делал, ибо это лишнее...

Второе - проблема решилась довольно просто: я при старте своего приложения запоминаю стиль и Opacity каждого окна (GetLayeredWindowAttributes, если стиль включает WS_EX_LAYERED), а при выгрузке просто восстанавливаю стили (это работает и с TopMost окнами). Кстати, что характерно, если значение Alpha меньше 255, то все отрабатывает как положено...
Malice
Цитата(volvo @ 18.01.2007 21:20) *

Кстати, что характерно, если значение Alpha меньше 255, то все отрабатывает как положено...

Т.е. если б сделал цикл до 255 всеб получилось ? Я знал smile.gif
volvo
Да, но я бы увидел только Alpha = 254... 255-я бы не отработала smile.gif
Malice
Да, но когда ты делал это TrackBar-ом, то результат был тот же и устраивал smile.gif
Snake_B
Цитата

Меня не интересуют разные ОСи... Программа использует функции, доступные ТОЛЬКО в XP (никак не раньше), поэтому оно должно корректно работать именно в XP и выше... Вистой еще не обзавелся (и в ближайшее время не намереваюсь)...


В 2000 тоже прозрачность работат... и энтот... transparent...
volvo
Snake_B, это расценивается как флейм...

Я без тебя знаю, что прозрачность работает и в 2000, и делается в 95/98 без особых проблем... Читай то, что сам же цитируешь внимательно... Доп. информацию я не просил...

P.S. Тем более, что вопрос уже решен dry.gif
Snake_B
Цитата(volvo @ 19.01.2007 6:20) *

Значится, так... Во-первых, Bokul, Юля совершенно права - никаких вызовов RePaint я не делал, ибо это лишнее...

Второе - проблема решилась довольно просто: я при старте своего приложения запоминаю стиль и Opacity каждого окна (GetLayeredWindowAttributes, если стиль включает WS_EX_LAYERED), а при выгрузке просто восстанавливаю стили (это работает и с TopMost окнами). Кстати, что характерно, если значение Alpha меньше 255, то все отрабатывает как положено...


а можно примерчик как это делается? =)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.