Фон Windows Aero Glass после гибернации нарушается.Как я могу решить это? - PullRequest
0 голосов
/ 13 февраля 2011

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

Я отображаю стекло через класс GlassHelper (можно найти в Google).

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

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

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

Теперь я вижу пути:

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

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

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

Ответы [ 3 ]

1 голос
/ 13 февраля 2011

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

1 голос
/ 17 февраля 2011

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

Я обрабатываю сообщения: WM_DWMCOMPOSITIONCHANGED (0x031E) & WM_THEMECHANGED (0x031A)

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

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

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, переключаюсь между разными стилями aero или неаэро или hibernate, так что это именно то, что я искал.Спасибо за ваши прекрасные идеи!

0 голосов
/ 13 февраля 2011

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

...