0

我正在用 C# .net 3.5 wpf 开发一个程序。它必须在 windows xp、windows vista 和 windows 7 上工作。在较新的操作系统上,我想在 Aero Glass 中创建背景。所以这只是一个特殊的设计。休眠后,暂停或将窗户设计更改为基本设计并返回航空后,所有添加的玻璃都显示为完全黑色。

我通过 GlassHelper 类显示 Glass(可以通过 Google 找到)。

实际上,我看到了解决此问题的 3 种方法。第一个是,是的,要解决它。但我在某处读到,这是 Windows 托管代码中的一个错误,所以我无法解决它。纠正我,如果我错了。

所以我有了每次关闭窗口的想法,它被最小化并完全重建,下次使用时。

这工作得很好。休眠后窗口仍然显示为黑色,但我不必退出应用程序,我仍然可以将其最小化并再次最大化。

现在我想办法:

1)我每次关闭窗口,计算机挂起,休眠或更改设计。当它被保存时,我再次打开它。但是我该如何处理呢?

2)我接受,该窗口将显示为黑色,直到有人将其最小化。(不是我最喜欢的)但后来我遇到了一个新问题:任务栏中的按钮。(不是托盘图标)。我需要它永久显示。在winxp上,最小化时我需要它来打开窗口。特别是在win7上我需要它,因为我想使用Superbar的一些新优势!(悬停预览不会是窗口,而是静态图片。)

谢谢大家,对我的帮助!

4

3 回答 3

1

尝试处理 WM_NCCALCSIZE 消息并将客户区 (NCCALCSIZE_PARAMS.rgrc0) 减少一个像素。我是认真的。我发现这个解决方案在谷歌浏览器中使用,它也适用于我。

于 2011-02-13T20:38:35.077 回答
1

好的,谢谢大家!但我想我找到了自己的解决方案!

我处理消息: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;
}

我明白了。

我钩住它。

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

我使 WPF 窗口背景透明,因为稍后在 WndProc 函数中我将只能访问我的 hwnd 背景 (Win32)。

window.Background = Brushes.Transparent;

现在我只需要第一次指定样式:

ApplyTheme(hwnd);

就是这样!在我禁用或启用 aero、在不同的 aero 或非 aero 样式之间切换或休眠后,对我来说非常适合(Win 64 Home Premium),所以这正是我想要的。谢谢你,你的好主意!

于 2011-02-16T22:39:25.777 回答
0

您可能想查看WPF Shell 集成库。我记得由于 Windows 7 中的桌面窗口管理器中的错误,该库存在类似的问题。该库具有可用的源代码,因此您可以查看它们是如何处理它的。

于 2011-02-13T16:38:49.047 回答