我想与大家分享这篇文章,因为我浪费了很多时间来理解为什么WS_EX_LAYERED标志在全新安装的Windows上无效(我的测试是在Win7上,我不知道它是否可以在Win8操作系统上复制。
这是我的代码:
...
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标志应该有效。
为什么?
答案 0 :(得分:3)
在花了将近一天的时间搜索解决方案后,我发现目标PC(托管可执行文件的PC)已禁用Aero Peek主题,因为它从未运行过“性能信息和工具”!
所以,恕我直言,一个将在他的代码中使用WS_EX_LAYERED的程序员,必须确定是否打开了Aero Peek(例如通过查看\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM
密钥注册表并检查EnableAreoPeek注册表值),否则某些窗口无法在任何PC中正确显示。
希望这能让你节省时间!
答案 1 :(得分:0)
我今天遇到过同样的问题(罗萨里奥我感受到你2年前的痛苦!)。
我无法弄清楚为什么窗户完全消失了。我确定其他人可能因为同样的原因而最终出现在此页面上。
因此我想了解一点。
关键因素似乎是"桌面窗口管理器会话管理器"必须运行服务才能使透明层运行。
EnableAeroPeek注册表值,与您在浏览时是否看到窗口的全屏预览(例如,使用alt-TAB或悬停在任务管理器迷你预览上)有关,可以保持关闭状态与我在多台机器上进行的测试中的透明度有关。
同样,如果该注册表设置已启用但DWMSM服务已关闭,则不会为您提供透明度。
罗萨里奥我很抱歉与你自己的问题相矛盾,但我认为这是一个重要的区别!到目前为止,测试Windows 7和Windows上透明度可用性的唯一方法是稍后在进行失败的调用(或使窗口不可见)之前,似乎是通过检查正在运行的dwm.exe进程。