3

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

为什么?

4

2 回答 2

4

在花了将近一天的时间寻找解决方案后,我发现目标 PC(承载可执行文件的 PC)禁用了 Aero Peek 主题,因为它从未运行过“性能信息和工具”!

因此,恕我直言,将在其代码中使用 WS_EX_LAYERED 的程序员必须确定 Aero Peek 是否已打开(例如,通过查看\HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM密钥注册表并检查 EnableAreoPeek 注册表值),否则某些窗口无法在任何 PC 中都能正确显示。

希望这能让您节省时间!

于 2013-11-13T10:50:03.443 回答
0

我今天也遇到了同样的问题(罗萨里奥,我感受到了两年前的痛苦!)。

我无法弄清楚为什么窗户会完全消失。我相信其他人可能会出于同样的原因访问此页面。

因此,我想了解一点。

对此的关键因素似乎是“桌面窗口管理器会话管理器”服务必须运行才能使透明层发挥作用。

EnableAeroPeek 注册表值与您在浏览窗口时是否看到窗口的全屏预览有关(例如,使用 alt-TAB 或将鼠标悬停在任务管理器迷你预览上),可以保持关闭状态并且它不连接到我在多台机器上进行的测试的透明度。

同样,如果该注册表设置已打开但 DWMSM 服务已关闭,它不会为您提供透明度。

罗萨里奥 很抱歉与您对自己问题的回答相矛盾,但我认为这是一个重要的区别!

到目前为止,在调用失败(或使窗口不可见)之前测试 Windows 7 及更高版本的透明度可用性的唯一方法似乎是检查正在运行的 dwm.exe 进程。

于 2016-01-08T19:26:31.647 回答