我怎样才能强制Aero绘制一个无边框窗口,就好像它是活动的一样,即使它不是?

时间:2011-11-15 08:57:15

标签: windows winforms windows-7 aero

我希望与windows 7任务栏具有相同的效果 我看过这个问题: Keep Window Looking Active
它工作得很好,但只有在窗口有非客户区域时才会有效。

我的窗口是无边框的,无论我做什么,它的内容(只是黑色背景)都会呈现为无效状态。

我将窗口标记设置为Windows 7任务栏,但它没有帮助。

我目前唯一想到的是用边框画它并剪辑它们,有没有更好的方法来达到我想要的效果?

编辑1:
剪切不起作用,剪切边框后窗口内容呈现为非活动窗口。 那么Windows 7任务栏到底如何运作呢?

EDIT2:
添加一些照片来更好地解释自己,以下窗口内容是黑色背景。

这是一个非活动窗口(内容呈现有点暗): Inactive window

这是一个活跃的窗口:
Active window

如果窗口没有客户区,则内容始终呈现为非活动窗口,但Windows任务栏始终呈现为活动窗口,并且没有任何NC区域(至少根据spy ++)。这就是我想要模仿的东西。

EDIT3:
分享我最近的发现。 explorer.exe主窗口是无框架的,并具有以下标志: Explorer image parameters

我潜入了探险家的进程dwmapi.dll导出函数: Explorer dwmapi.dll exported functions

它使用DwmEnableBlurBehindWindow,就像我一样 我检查了未记录的序数函数,但没有一个与将空气玻璃渲染为活动状态有关。

可能是DWM规则不适用于资源管理器吗?

1 个答案:

答案 0 :(得分:2)

整蛊...... 使用“DwmSetWindowAttribute”API将NCRenderingPolicy设置为Enabled http://msdn.microsoft.com/en-us/library/windows/desktop/aa969524(v=vs.85).aspx

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);

    [Flags]
    public enum DwmWindowAttribute
    {
        NCRenderingEnabled = 1,
        NCRenderingPolicy,
        TransitionsForceDisabled,
        AllowNCPaint,
        CaptionButtonBounds,
        NonClientRtlLayout,
        ForceIconicRepresentation,
        Flip3DPolicy,
        ExtendedFrameBounds,
        HasIconicBitmap,
        DisallowPeek,
        ExcludedFromPeek,
        Last
    }

    [Flags]
    public enum DwmNCRenderingPolicy
    {
        UseWindowStyle,
        Disabled,
        Enabled,
        Last
    }

    public static bool SetNCRenderingActive(IntPtr Handle)
    {
        int renderPolicy = (int)DwmNCRenderingPolicy.Enabled;            
        return (DwmSetWindowAttribute(Handle, (int)DwmWindowAttribute.NCRenderingPolicy, ref renderPolicy, sizeof(int)  ) == 0);
    }