Фон Windows Aero стекло сломан после гибернации.Как я могу решить это?
-
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. В библиотеке есть его источник, чтобы вы могли посмотреть, как они обрабатывают это.