WS_EX_LAYERED, невидимое окно и новая установка Windows
Я хотел бы поделиться с вами этим постом, так как потратил много времени, чтобы понять, почему флаг WS_EX_LAYERED не работал при новой установке Windows (мой тест был на Win7, я не знаю, можно ли его воспроизвести на Win8 OS).
Это был мой код:
...
hParentWindow=hWnd;
HWND myWnd=CreateWindowEx(WS_EX_LAYERED|WS_EX_PALETTEWINDOW,_T("STATIC"),_T(""), WS_POPUP|SS_BITMAP,position.left,position.top, position.right, position.bottom,hWnd,NULL,hInst,NULL);
Затем я хотел добавить прозрачный слой:
CWnd::FromHandle(myWnd)->SetLayeredWindowAttributes(RGB(0,0,0), 255*0.6, LWA_ALPHA);
Запустив код, окно так и не появилось! И это не было дочерним окном (WS_EX_LAYERED не работает для дочернего окна), поэтому флаг WS_EX_LAYERED должен был работать.
Зачем?
2 ответа
Потратив почти день на поиск решения, я обнаружил, что на целевом ПК (на котором размещен исполняемый файл) тема Aero Peek отключена, поскольку он никогда не запускал "Информация о производительности и инструменты"!
Итак, IMHO, программист, который собирается использовать WS_EX_LAYERED в своем коде, должен определить, включен Aero Peek или нет (например, просматривая \HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM
ключ реестра и проверьте значение реестра EnableAreoPeek), иначе некоторые окна не могли бы отображаться правильно ни на одном ПК.
Надеюсь, это поможет вам сэкономить время!
У меня были те же проблемы сегодня (Розарио, я чувствую твою боль 2 года назад!).
Я не мог понять, почему окна исчезают полностью. Я уверен, что другие могут оказаться на этой странице по той же причине.
Как таковой, я хотел бы остановиться на одной точке.
Ключевым фактором этого является то, что для работы прозрачных слоев должна быть запущена служба "Диспетчер сессий диспетчера окон рабочего стола".
Это значение реестра EnableAeroPeek, которое относится к тому, видите ли вы полноэкранный предварительный просмотр окон при их просмотре (например, с помощью alt-TAB или при наведении указателя мыши на мини-предварительный просмотр менеджера задач), может оставаться отключенным и не подключенным к Наличие прозрачности в тестах я проводил на нескольких машинах.
Точно так же, если этот параметр реестра включен, но служба DWMSM отключена, это не даст вам прозрачности.
Розарио Мне жаль противоречить вашему собственному ответу на свой вопрос, но я думаю, что это важное различие!
Пока что единственный способ проверить доступность прозрачности в Windows 7 и более поздних версиях перед выполнением вызова, который завершается сбоем (или делает окно невидимым), - это проверка работающего процесса dwm.exe.