Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Прозрачность окна чужого приложения

Автор: volvo 17.01.2007 23:25

Привем всем...

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

Почему же не срабатывает установление

SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
при закрытии моего приложения? И именно для TopMost окон, остальные же прекрасно обрабатываются... blink.gif

Автор: мисс_граффити 18.01.2007 1:25

Под разными ОСями одно и то же?

Автор: volvo 18.01.2007 2:05

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

Автор: Malice 18.01.2007 3:19

Немного не понял: т.е. если сделать отдельную кнопку "Восстановить", которая пробежит по измененным окнам и вернет все на место, то работает, а при закрытии тот же код не работает ?

Автор: volvo 18.01.2007 3:32

Нет... Кнопка тоже не отработала для TOPMOST-окон... Для них работает только изменение вручную (я пользуюсь TrackBar-ом)... Ничего не понимаю... Какая разница, КАК и ОТКУДА я вызываю? Это же одна и та же процедура... blink.gif

Автор: Bokul 18.01.2007 5:36

Может ты repaint забываешь вызывать?

Цитата
Почему же не срабатывает установление при закрытии моего приложения?

В http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/usingwindows.asp советуют убирать прозрачность полностью (устранять стиль WS_EX_LAYERED), а не делать ее нулевой.

Автор: Malice 18.01.2007 13:57

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

Автор: мисс_граффити 18.01.2007 14:00

Цитата
Может ты repaint забываешь вызывать?

Цитата
Note that you don't need to call RedrawWindow or somesuch after this; SetLayeredWindowAttributes itself causes a redraw.

Автор: Гость 19.01.2007 1:00

А если дважды вызывать

Код

SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);

Автор: volvo 19.01.2007 1:20

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

Второе - проблема решилась довольно просто: я при старте своего приложения запоминаю стиль и Opacity каждого окна (http://msdn2.microsoft.com/en-us/library/ms633508.aspx, если стиль включает WS_EX_LAYERED), а при выгрузке просто восстанавливаю стили (это работает и с TopMost окнами). Кстати, что характерно, если значение Alpha меньше 255, то все отрабатывает как положено...

Автор: Malice 19.01.2007 1:30

Цитата(volvo @ 18.01.2007 21:20) *

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

Т.е. если б сделал цикл до 255 всеб получилось ? Я знал smile.gif

Автор: volvo 19.01.2007 1:33

Да, но я бы увидел только Alpha = 254... 255-я бы не отработала smile.gif

Автор: Malice 19.01.2007 1:39

Да, но когда ты делал это TrackBar-ом, то результат был тот же и устраивал smile.gif

Автор: Snake_B 6.02.2007 20:59

Цитата

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


В 2000 тоже прозрачность работат... и энтот... transparent...

Автор: volvo 6.02.2007 21:02

Snake_B, это расценивается как флейм...

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

P.S. Тем более, что вопрос уже решен dry.gif

Автор: Snake_B 9.08.2008 1:39

Цитата(volvo @ 19.01.2007 6:20) *

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

Второе - проблема решилась довольно просто: я при старте своего приложения запоминаю стиль и Opacity каждого окна (http://msdn2.microsoft.com/en-us/library/ms633508.aspx, если стиль включает WS_EX_LAYERED), а при выгрузке просто восстанавливаю стили (это работает и с TopMost окнами). Кстати, что характерно, если значение Alpha меньше 255, то все отрабатывает как положено...


а можно примерчик как это делается? =)