Фон Windows Aero стекло сломан после гибернации.Как я могу решить это?

StackOverflow https://stackoverflow.com/questions/4985056

  •  13-11-2019
  •  | 
  •  

Вопрос

Я разрабатываю программу в C # .NET 3.5 WPF. Он должен работать на Windows XP, Windows Vista и Windows 7. На более новых системах операций, которые я просмотра, чтобы создать фон в Aero Glass. Так что это только специальный дизайн. После того, как в гибернации после приостановления или после смены Windows Desings к базовому дизайну и обратно на Aero все добавленное стекло отображается полностью черным.

i Дисплей стекла через класс Glasshelper (можно найти с Google).

На самом деле я вижу 3 способа решения этой проблемы. Во-первых, да, чтобы решить это. Но я прочитал где-нибудь, что это ошибка в Windows управляемого кода, поэтому у меня нет возможности совется. Поправьте меня, если я ошибаюсь.

Поэтому у меня была идея закрыть окно каждый раз, его сводится к минимуму и полностью восстановить, когда он используется в следующий раз.

Это работает довольно хорошо. После Hibernate окно все еще отображается черным, но мне не нужно бросить приложение, я все еще могу минимизировать его и снова максимизировать.

Теперь я вижу способы:

1) Я закрываю окно каждый раз, компьютер приоритет, гибернат или изменяет дизайн. И я снова открываю это окно, когда он сохраняет. Но как я могу справиться с этим?

2) Я принимаю, что окно будет отображено в черном, пока кто-то его министрирует. (Не мой любимый) Но тогда я получаю новую проблему: кнопка в панели задач. (Не значок лотка). Мне нужно, чтобы он был отображен навсегда. На WinXP мне нужно, чтобы открыть окно, когда минимизируется. И особенно на Win7 мне нужна, потому что я хочу использовать некоторые из новых преимуществ супербара! (Предварительный просмотр Heovering не будет окном, это статическое изображение.)

Спасибо всем, за помощь мне!

Это было полезно?

Решение 2

ОК, спасибо всем!Но я думаю, что нашел свое собственное решение!

Я обрабатывать сообщения: wm_dwmcompositionchanged (0x031e) & wm_themechanged (0x031a)

и на ловке одного из этих сообщений, которые я просто назначаю стекло снова или новый фон в зависимости от DWMISCOMPOSINTEDENDED ().

На самом деле у меня есть что-то похожее на следующее:

const int WM_THEMECHANGED = 0x031A;
const int WM_DWMCOMPOSITIONCHANGED = 0x031E;

private static void ApplyTheme(IntPtr hwnd)
{
    if (DwmIsCompositionEnabled())
    {
        HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
        MARGINS margins = new MARGINS(new Thickness(-1));
        DwmExtendFrameIntoClientArea(hwnd, ref margins);
    }
    else
    {
        HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = SystemColors.ActiveCaptionBrush.Color;
    }
}

private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_THEMECHANGED)
    {
        ApplyTheme(hwnd);
    }
    if (msg == WM_DWMCOMPOSITIONCHANGED)
    {
        ApplyTheme(hwnd);
    }
    return IntPtr.Zero;
}
.

Я получаю HWND.

Я подключаю это.

HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
.

Я делаю фона окна WPF прозрачным, потому что позже в функции WndProc я смогу получить доступ только к моему фону HWND (Win32).

window.Background = Brushes.Transparent;
.

А теперь мне нужно только назначить стиль в первый раз:

ApplyTheme(hwnd);
.

Это это!Работает идеально для меня (Win 64 Home Premium) После отключения или включена Aero, переключайтесь между различными аэро или неаэродозгами или гибернатом, так что именно то, что я искал.Спасибо, за ваши отличные идеи!

Другие советы

Попробуйте обрабатывать сообщение WM_NCCALCSIZE и уменьшить клиентскую область (nccalcsize_params.rgrc0) одним пикселем.Я серьезно.Я нашел это решение используется в Google Chrome, и он тоже работает нормально.

Возможно, вы можете взглянуть на Библиотека интеграции оболочки WPF . Я могу наменять возникновения подобных проблем с этой библиотекой из-за ошибки в оконном менеджере на рабочем столе в Windows 7. В библиотеке есть его источник, чтобы вы могли посмотреть, как они обрабатывают это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top