如何确保启用了Aero效果?

4

有没有任何API或其他方法可以确保玻璃效果已经激活?在我看到的一些代码中,如果抛出DllNotFoundException,则说明它未激活或不存在。是否有更好或标准的方法?

这是使用Aero效果来扩展WPF中的玻璃区域的解决方案。


有关DWM函数列表,请参阅DWM函数 - Jeff Mercado
你是否针对Windows Vista之前的版本(如Windows XP)进行开发?如果不是,那么就没有必要检查DllNotFoundException。该测试的目的不是确定Aero效果是否启用,而是在主机操作系统不支持驱动Aero界面的桌面窗口管理器(DWM)函数的情况下进行检测。 - Cody Gray
1个回答

10

这个MSDN页面中,它建议您使用DwmIsCompositionEnabled来检测玻璃效果:

当桌面组合的状态改变时,会广播一个WM_DWMCOMPOSITIONCHANGED消息。没有参数告诉你它是被启用还是禁用,所以如果您感兴趣,就需要调用DwmIsCompositionEnabled。检查的代码很简单,麻烦的部分是决定如果组合被禁用,您希望窗口看起来如何。

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();

// Check to see if composition is Enabled
if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
{
    // enable glass rendering
}
else
{
    // fallback rendering
}

我不确定是否可以“启用Aero”但是“禁用Glass”,如果可以,这种方法会产生什么结果。


这并没有真正解决捕获DllNotFoundException所涉及的问题。在Vista之前的Windows版本中,dwmapi.dll不存在。因此,尝试从该DLL调用函数将失败。只有在主机操作系统为Vista或更高版本时,才能成功调用DwmIsCompositionEnabled - Cody Gray
1
我认为如果我们使用Environment.OS.Version >= 6进行迁移,那么它就会完整! - Jalal
抱歉 - 我没有考虑到Vista之前的版本。如果你需要针对它们进行目标定位,像你建议的那样检查OS.Version可能是最好的方法。 - Danny Tuppeny
@DannyTuppeny 在 PreserveSig 字段的文档中写道:“当您将 PreserveSig 字段设置为 false 时,生成的方法签名将包含 void 返回类型而不是整数 (HRESULT) 返回类型。”那么,你的签名 public static extern bool DwmIsCompositionEnabled() 怎么可能工作(它确实可以工作,我测试过了 :))?根据文档,正确的形式应该是:public static extern void DwmIsCompositionEnabled(out bool enabled) - Dominik Palo
@DominikPalo 我也不知道 =D 之前有人问过类似的问题,但并没有得到真正的答案!https://social.msdn.microsoft.com/Forums/vstudio/en-US/04f36843-ccbc-40e0-8017-8253c4aa139e/how-does-dllimportattributepreservesig-handle-modified-signatures?forum=netfxbcl - Danny Tuppeny
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接