Windows Aero Glassの背景は休止状態の後に壊れています。どうやってこれを解決できますか?
-
13-11-2019 - |
質問
C#.NET 3.5 WPFでプログラムを開発しています。 Windows XP、Windows Vista、Windows 7で機能する必要があります。だからこれは特別なデザインだけです。休止状態の後、吊り下げた後、またはWindowsを変更した後、基本的なデザインに及びAeroに戻るすべての追加ガラスが完全に黒く表示されます。
私はGlasshelperクラスを介してガラスを表示する(Googleで見つけることができます)。
実際にこの問題を解決するための3つの方法が見られます。最初は、それを解決するためのええです。しかし、私はここ体を読み、これはWindowsマネージドコードのバグであるので、それを起点するオプションがないように。私が間違っているなら、私を訂正してください。
だから私は毎回ウィンドウを閉じるというアイデアを持っていました、それは次回使われるときに完全に再構築されます。
それは非常にうまく機能します。 Hibernateの後、ウィンドウはまだ黒く表示されていますが、アプリケーションを終了する必要はありません。これはそれを最小化して再度最大化することができます。
今すぐに見えます:
1)毎回ウィンドウを閉じ、コンピュータの中断、休止状態、またはデザインを変更します。保存されているときは、もう一度ウィンドウを開きます。しかし、どうやってこれを処理することができますか?
2)誰かがそれを最小限に抑えるまで、ウィンドウが黒く表示されることを受け入れます。 (私のお気に入りではありません)だたが、私は新しい問題を得る:タスクバーのボタン。 (トレイアイコンではありません)。私はそれが永久に表示される必要があります。 WinXPでは、最小化されたときにウィンドウを開く必要があります。そして特にWin7では私はスーパーバーの新しい利点のいくつかを使いたいのでそれが必要です! (船上によるプレビューはウィンドウにはなりません。静的な画像になります。)
私を助けてくれてありがとう!
解決 2
OK、みんなありがとうございました!しかし、私は自分の解決策を見つけたと思います!
メッセージを処理します: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;
}
.
hwndを手に入れます。
私はそれをフックします。
HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
.
私は後でWNDPROC関数で私のHWNDの背景にのみアクセスできるようにするために、WPFウィンドウの背景を透明にします(Win32)。
window.Background = Brushes.Transparent;
.
そして今、私は初めてスタイルを割り当てるだけです:
ApplyTheme(hwnd);
.
それは!私にとって完璧に機能します(64のホームプレミアムを獲得してください)私がエアロを無効または有効にした後、さまざまなエアロや非エアロスタイルや休止状態を切り替えた後、まさに私が探していたものです。あなたの素晴らしいアイデアのためにありがとう!
他のヒント
WM_NCCalcSizeメッセージを処理し、クライアント領域(NCCALCSIZE_PARAMS.RGRC0)を1ピクセルだけ軽減します。私は真剣です。私はこの解決策がGoogle Chromeで使用されていて、私にもうまく機能します。
WPFシェル統合ライブラリーを見たい場合があります。 Windows 7のデスクトップウィンドウマネージャのバグが原因でそのライブラリに似た問題があったと思い出されることができます。