Windows Aero Glass Background est cassé après Hibernate. Comment puis-je résoudre ça?

StackOverflow https://stackoverflow.com/questions/4985056

  •  13-11-2019
  •  | 
  •  

Question

Je développe un programme en C # .NET 3.5 WPF. Il doit fonctionner sur Windows XP, Windows Vista et Windows 7. Sur les nouveaux systèmes de fonctionnement, je veux créer l'arrière-plan en verre aérodynamique. Ce n'est donc qu'une conception spéciale. Après Hibernate, après avoir suspendu ou après avoir modifié les dessins Windows en une conception de base et de retour à Aero, tout le verre ajouté est affiché complètement noir.

J'affiche du verre via la classe Glasshelper (se trouve avec Google).

En fait, je vois 3 façons de résoudre ce problème. Le premier est, oui pour le résoudre. Mais j'ai lu Somwhere, qu'il s'agit d'un bogue dans le code géré Windows, donc je n'ai pas d'option pour le Sovle. Corrigez-moi si je me trompe.

J'ai donc eu l'idée de fermer la fenêtre à chaque fois, il est minimisé et de reconstruire complètement, lorsqu'il est utilisé la prochaine fois.

Cela fonctionne assez bien. Après hibernate, la fenêtre est toujours affichée en noir, mais je n'ai pas à quitter l'application, je peux toujours le minimiser et maximiser à nouveau.

Maintenant, je vois des moyens:

1) Je ferme la fenêtre à chaque fois, l'ordinateur suspend, hiberne ou modifie la conception. Et je l'ouvre à nouveau la fenêtre, quand il est sauvegardé. Mais comment puis-je gérer cela?

2) J'accepte que la fenêtre sera affichée en noir, jusqu'à ce que quelqu'un le minimise. (Pas mon préféré) Mais j'ai un nouveau problème: le bouton dans la barre des tâches. (Pas l'icône du plateau). J'en ai besoin pour être affiché en permanence. Sur WinXP, j'en ai besoin pour ouvrir la fenêtre, une fois minimisé. Et surtout sur Win7, j'en ai besoin parce que je veux utiliser certains des nouveaux avantages du Superbar! (L'aperçu de Hooverring ne sera pas la fenêtre, ce sera une image statique.)

Merci à tous, de m'avoir aidé!

Était-ce utile?

La solution 2

Ok, merci à tous! Mais je pense que j'ai trouvé ma propre solution!

Je gère les messages: WM_DWMCOMPOSITIONCHANGED (0x031E) & WM_TheMechanged (0x031a)

Et en attrapant l'un de ces messages, j'attribue à nouveau le verre ou un nouveau fond en fonction de dwMisCompositionEnabled ().

En fait, j'ai quelque chose de similaire à ce qui suit:

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;
}

Je reçois le hwnd.

Je l'accroche.

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

Je rend le fond de la fenêtre WPF transparent, car plus tard, dans la fonction WNDProc, je ne pourrai accéder à mon arrière-plan HWND (Win32).

window.Background = Brushes.Transparent;

Et maintenant, je n'ai qu'à attribuer le style pour la première fois:

ApplyTheme(hwnd);

C'est ça! Fonctionne parfaitement pour moi (gagner 64 Home Premium) après avoir désactivé ou activé Aero, basculer entre différents styles aéro ou non aéro ou hibernate, donc c'est exactement ce que je cherchais. Merci pour vos super idées!

Autres conseils

Essayez de gérer le message WM_NCCALCSIZE et réduisez la zone du client (NCCALCSIZE_PARAMS.RGRC0) par un pixel. Je suis sérieux. J'ai trouvé que cette solution est utilisée dans Google Chrome et cela fonctionne bien pour moi aussi.

Vous voudrez peut-être jeter un œil au Bibliothèque d'intégration de shell WPF. Je peux me souvenir qu'il y avait des problèmes similaires avec cette bibliothèque en raison d'un bogue dans le gestionnaire de fenêtres de bureau dans Windows 7. La bibliothèque a sa source disponible afin que vous puissiez jeter un œil à la façon dont ils le gèrent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top