c# - 如何订阅在禁用 DWM 组合/Aero Glass 时引发的操作系统级事件?

标签 c# .net windows aero dwm

我正在开发一个在主窗体中支持 Windows Aero 的 C# 应用程序。

一些不支持视觉样式的应用程序,例如 GoToMeeting , 禁用视觉样式,并且在 GoToMeeting 运行时错误地绘制了我的表单(Aero 客户区被绘制成黑色)。

我如何订阅在禁用视觉样式时触发的操作系统事件?然后我可以调整窗口中的客户区以正确绘制。

托管和非托管解决方案对我都有效。

提前致谢。


编辑:根据汉斯的回答,这里是管理这个事件的代码:

private const int WM_DWMCOMPOSITIONCHANGED = 0x31e;

[DllImport("dwmapi.dll")]
private static extern void DwmIsCompositionEnabled(ref bool pfEnabled);

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_DWMCOMPOSITIONCHANGED)
    {
        bool compositionEnabled = false;
        DwmIsCompositionEnabled(ref compositionEnabled);

        if (compositionEnabled)
        {
           // composition has been enabled
        }
        else
        {
           // composition has been disabled
        }
    }

    base.WndProc (ref m);
}

最佳答案

Windows 向您的顶层窗口发送一条消息。例如,您会将其困在 Winforms 窗体的 WndProc 覆盖中。监听 WM_DWMCOMPOSITIONCHANGED,消息编号 0x31e。

关于c# - 如何订阅在禁用 DWM 组合/Aero Glass 时引发的操作系统级事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5730753/

相关文章:

c# 不允许请求的注册表访问

.net - 将超链接设置为 RichTextBox

C# 可插拔架构,论文考虑

jquery - 添加 "Microsoft.jQuery.Unobtrusive.Validation"包需要 jQuery 1.4.1?

windows - Stack (Haskell) 在 Windows 中抛出 TlsException

linux - 为什么我无法在基于 Linux 的系统上 native 运行 .exe 文件?

c++ - 如何在运行时简化代码生成?

c# - 如何从 ViewStart 中访问(自定义)Web 助手?

c# - 根据日期和自动递增的数字创建一个唯一的数字

c# - XNA 旋转 Sprite 以准确面对光标