有没有任何API或其他方法可以确保玻璃效果已经激活?在我看到的一些代码中,如果抛出DllNotFoundException
,则说明它未激活或不存在。是否有更好或标准的方法?
这是使用Aero效果来扩展WPF中的玻璃区域的解决方案。
在这个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 GrayEnvironment.OS.Version >= 6
进行迁移,那么它就会完整! - JalalPreserveSig
字段的文档中写道:“当您将 PreserveSig 字段设置为 false 时,生成的方法签名将包含 void 返回类型而不是整数 (HRESULT) 返回类型。”那么,你的签名 public static extern bool DwmIsCompositionEnabled()
怎么可能工作(它确实可以工作,我测试过了 :))?根据文档,正确的形式应该是:public static extern void DwmIsCompositionEnabled(out bool enabled)
。 - Dominik Palo
DllNotFoundException
。该测试的目的不是确定Aero效果是否启用,而是在主机操作系统不支持驱动Aero界面的桌面窗口管理器(DWM)函数的情况下进行检测。 - Cody Gray