0

私はC#.net3.5wpfでプログラムを開発しています。Windows XP、Windows Vista、Windows 7で動作する必要があります。新しいオペレーティングシステムでは、AeroGlassで背景を作成したいと思います。したがって、これは特別な設計にすぎません。冬眠後、一時停止後、またはウィンドウの変更後基本的なデザインに設計し、エアロに戻すと、追加されたすべてのガラスが完全に黒く表示されます。

GlassHelperクラス(Googleで見つけることができます)を介してGlassを表示します。

実際、私はこの問題を解決する3つの方法を見ています。1つ目は、それを解決することです。しかし、私はどこかで、これはWindowsマネージコードのバグであると読んだので、それを解決するオプションはありません。私が間違っているなら、私を訂正してください。

そのため、ウィンドウを毎回閉じることを考えました。ウィンドウは最小化され、次回使用するときに完全に再構築されます。

それは非常にうまく機能します。休止状態の後もウィンドウは黒で表示されますが、アプリケーションを終了する必要はありません。最小化して再度最大化することができます。

今、私は方法を見ています:

1)毎回ウィンドウを閉じると、コンピューターが一時停止、休止状態、またはデザインを変更します。そして、それが保存されたときに、私はそれを再びウィンドウを開きます。しかし、どうすればこれを処理できますか?

2)誰かが最小化するまで、ウィンドウが黒で表示されることを受け入れます。(私のお気に入りではありません)しかし、新しい問題が発生します:タスクバーのボタン。(トレイアイコンではありません)。永続的に表示する必要があります。winxpでは、最小化したときにウィンドウを開くために必要です。そして特にwin7では、スーパーバーの新しい利点のいくつかを使用したいので、それが必要です!(フーバーによるプレビューはウィンドウではなく、静止画像になります。)

みんな、助けてくれてありがとう!

4

3 に答える 3

1

わかりました、みんなありがとう!しかし、私は自分の解決策を見つけたと思います!

メッセージを処理します: WM_DWMCOMPOSITIONCHANGED (0x031E) & WM_THEMECHANGED (0x031A)

これらのメッセージの 1 つをキャッチすると、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));

後で WndProc 関数で hwnd Background (Win32) にしかアクセスできないため、WPF ウィンドウの背景を透明にします。

window.Background = Brushes.Transparent;

そして今、私は最初にスタイルを割り当てるだけです:

ApplyTheme(hwnd);

それでおしまい!aeroを無効または有効にした後、別のaeroスタイルまたは非aeroスタイルに切り替えたり、休止状態にしたりした後、私(Win 64 Home Premium)にとって完璧に機能するので、まさに私が探していたものです. 素晴らしいアイデアをありがとう!

于 2011-02-16T22:39:25.777 に答える
1

WM_NCCALCSIZE メッセージを処理し、クライアント領域 (NCCALCSIZE_PARAMS.rgrc0) を 1 ピクセル減らしてみてください。私は真剣です。このソリューションは Google Chrome で使用されていることがわかり、私にとっても問題なく機能します。

于 2011-02-13T20:38:35.077 に答える
0

WPFシェル統合ライブラリを確認することをお勧めします。Windows 7のデスクトップウィンドウマネージャーのバグが原因で、そのライブラリに同様の問題があったことを思い出すことができます。ライブラリにはソースが用意されているので、ライブラリがどのように処理するかを確認できます。

于 2011-02-13T16:38:49.047 に答える