1

我有一个所有者绘图窗口标题,我使用 C#、Windows 窗体、P/Invoking dwmapi.dll 和其他几个 Windows 库创建它。

要检测是否启用了 DWM,我使用以下代码:

private bool isDwmWindowFramePaintEnabled()
{
    try
    {
        return WinApi.DwmIsCompositionEnabled();
    }
    catch (DllNotFoundException)
    {
        return false;
    }
}

要绘制窗口标题,我使用视觉样式渲染器。我仅在启用 DWM 时绘制窗口标题。这是一段代码:

var renderer = new VisualStyleRenderer(VisualStyleElement.Window.Caption.Active);
WinApi.DrawThemeTextEx(renderer.Handle, memDc, 0, 0, text, -1, uFormat, ref clientRect, ref dttOpts);

我的代码应该可以在支持 Aero 主题 (7/Vista/8) 的 Windows 操作系统上运行。最近我在 VisualStyleRender c'tor 中遇到了下一个异常:

System.InvalidOperationException: Visual Styles-related operation resulted in an error because visual styles are currently disabled in the client area.

这件事发生在 Windows 8 OS (6.2.9200.0) 上。当我测试我的代码时,它在 Windows Vista/7/8 上的任何主题上都能完美运行,包括经典主题和高对比度主题。

所以,我的问题是,为什么会这样?视觉样式是否有可能在 Windows 8 上被禁用?我应该如何解决它?是否有任何事件通知视觉样式已关闭?我知道我可以使用 property 检查是否启用了视觉样式VisualStyleRenderer.IsSupported,但我至少想测试我的解决方案。而且我不知道如何重现这种情况。

4

0 回答 0