Как заставить Aero нарисовать окно без полей, как если бы оно было активным, даже если это не так? - PullRequest
24 голосов
/ 15 ноября 2011

Я бы хотел иметь тот же эффект, что и панель задач Windows 7.
Я посмотрел в этом вопросе: Сохранить окно в активном состоянии
Он отлично работает, но только если у окна есть не клиентская область.

Мое окно не имеет границ, и его содержимое (просто черный фон) отображается как неактивное, независимо от того, что я делаю.

Я установил свои флаги окна так же, как панель задач 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 Ответ

2 голосов
/ 06 марта 2012

хитрый ..установите для NCRenderingPolicy значение «Включено» с помощью API «DwmSetWindowAttribute».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);
    }
...