WS_EX_LAYERED,不可见窗口和Windows的全新安装

时间:2013-11-13 10:30:51

标签: visual-c++ windows-7 mfc aero ws-ex-layered

我想与大家分享这篇文章,因为我浪费了很多时间来理解为什么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标志应该有效。

为什么?

2 个答案:

答案 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进程。