我正在开发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中的桌面窗口管理器中的错误而导致该库的类似问题。图书馆的源可用,因此您可以查看它们如何处理它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top