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



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

为什么?

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

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

希望这能让您节省时间!

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

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

因此,我想谈一点。

造成这种情况的关键因素似乎是必须运行"桌面窗口管理器会话管理器"服务才能使透明层正常运行。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新