Windows Aero玻璃背景在冬眠后被打破。我该如何解决这个问题?
-
13-11-2019 - |
题
我正在开发C#.NET 3.5 WPF中的程序。它必须在Windows XP,Windows Vista和Windows 7上工作。在较新的操作系统上,我的旗帜在Aero玻璃中创建背景。所以这只是一种特殊的设计。在休眠后,暂停或将窗口更改为基本设计并返回Aero后,所有添加的玻璃都会显示完全黑色。
我通过玻璃衬里级展示玻璃(可以用谷歌找到)。
实际上我看到了3种方法来解决这个问题。首先是,是的,解决它。但是我读到了,这是Windows托管代码中的一个错误,所以我没有选择它。纠正我,如果我错了。
所以我有想法每次关闭窗口,它是最小化的,并在下次使用时完全重建。
工作很好。 Hibernate后窗口仍然显示为黑色,但我不必退出应用程序,我仍然可以最小化它并再次最大化。
现在我看到了方式:
1)每次关闭窗口,计算机挂起,休眠或更改设计。当它保存时,我再次打开窗口。但我如何处理这个?
2)我接受,窗口将以黑色显示,直到有人最小化。 (不是我最喜欢的)但是我收到一个新问题:任务栏中的按钮。 (不是托盘图标)。我需要它永久地显示。在WinXP上,我需要它在最小化时打开窗口。特别是在Win7上,我需要它,因为我想使用超级栏的一些新的优势! (通过hoovering预览将不是窗口,它将是一个静态图片。)
谢谢大家,为帮助我!
解决方案 2
i处理消息:wm_dwmcompositchanged(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);
.
是!在我禁用或启用Aero后,在不同的Aero或非航空风格或休眠之间切换,完全适用于我(赢取64房间溢价)谢谢你,为了你的伟大想法!
其他提示
尝试通过一个像素处理WM_NCCALCSIZE消息并减少客户区(NCCALCSIZE_PARAMS.RGRC0)。我是认真的。我发现这个解决方案用于Google Chrome,它也适合我。
您可能希望查看 wpf shell集成库。 我可以记得由于Windows 7中的桌面窗口管理器中的错误而导致该库的类似问题。图书馆的源可用,因此您可以查看它们如何处理它。