none
DwmApi.EnableBlurBehindWindow: Vista - 7 Problem RRS feed

  • Frage

  • Hallo,

    ich nutze in einem meiner Programme EnableBlurBehindWindow um den Aero Glas Effekt herzustellen. Das komische ist unter Windows 7 sieht alles richtig aus, unter Vista jedoch ist das Fenster einfach nur durchsichtig ohne Glas. Hier der Code:

        protected override void OnSourceInitialized(EventArgs e)
        {
          try
          {
            base.OnSourceInitialized(e);
    
            DwmApi.EnableBlurBehindWindow(ContentBorder, this);
    
            IntPtr hwnd = new WindowInteropHelper(this).Handle;
            HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
    
          }
          catch (Exception ex)
          { }
        }
    
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
          try
          {
            if (msg == DwmApi.WINDOWPOSCHANGED)
            {
              DwmApi.EnableBlurBehindWindow(ContentBorder, this);
              handled = false;
            }
    
          }
          catch (Exception ex)
          { }
          return IntPtr.Zero;
        }
    
    
    Auf DwmExtendFrameIntoClientArea auszuweichen ist für mich keine Option, da mein Fenster kein Rahmen hat und das somit nicht geht...

    Hat jemand eine Idee woran das liegen kann bzw. wie man das fixen kann?

    Grüße Jan

    Freitag, 9. Juli 2010 12:19

Alle Antworten

  • Hallo Jan,

    es gibt ein paar Vorausetzungen/Einstellungen, die den Glass-Effekt unter Vista beeinflussen können:

    [Windows Vista for Developers – Part 3 – The Desktop Window Manager - Kenny Kerr]
    http://weblogs.asp.net/kennykerr/archive/2006/08/10/Windows-Vista-for-Developers-_1320_-Part-3-_1320_-The-Desktop-Window-Manager.aspx

    Diese müsstest Du ggf. setzen bzw. prüfen.

     


    ciao Frank
    Freitag, 9. Juli 2010 13:56
  • Hallo Frank,

    danke für die schnelle Antwort. Leider hab ich noch kein Grund für das Ausbleiben von Aero Glas finden können.

    Andere Glas Test Fenster mit DwmExtendFrameIntoClientArea funktionieren unter der Vista Version.

    Ich hab hier mal noch die EnableBlurBehindWindow Funktion:

      public static void EnableBlurBehindWindow(Border element, Window window)
      {
       try
       {
        if (!DwmIsCompositionEnabled())
         return;
    
        // Get the window handle
        IntPtr hwnd = new WindowInteropHelper(window).Handle;
        if (hwnd == IntPtr.Zero)
         throw new InvalidOperationException("Window muss sichbar sein um Blur anzuwenden!");
    
        window.Background = Brushes.Transparent;
        HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
    
        if (_lastRegion != IntPtr.Zero)
         DeleteObject(_lastRegion);
    
        var region = CreateRoundRectRgn((int)element.Margin.Left, (int)element.Margin.Top,
         (int)(element.ActualWidth + element.Margin.Left), (int)(element.ActualHeight + element.Margin.Top),
         (int)element.CornerRadius.TopLeft, (int)element.CornerRadius.TopLeft);
    
        _lastRegion = region;
    
        // Set Margins
        DWM_BLURBEHIND blurBehind = new DWM_BLURBEHIND();
        blurBehind.fEnable = true;
        blurBehind.fTransitionOnMaximized = true;
        blurBehind.hRegionBlur = region;
        blurBehind.dwFlags = DWM_BLURBEHIND.DWM_BB_BLURREGION | DWM_BLURBEHIND.DWM_BB_ENABLE | DWM_BLURBEHIND.DWM_BB_TRANSITIONONMAXIMIZED;
    
        DwmEnableBlurBehindWindow(hwnd, blurBehind);
       }
       catch (DllNotFoundException)
       {
       }
      }
    

     

    Grüße Jan

    Freitag, 9. Juli 2010 15:42
  • Hallo Jan,

    ok, dann müssen wir da wohl mal step by step durch.

    Lade Dir mal flogendes herunter (hast Du wahrscheinlich schon?) : 

    [Windows® API Code Pack for Microsoft® .NET Framework - Release: Windows API Code Pack 1.0.1]
    http://code.msdn.microsoft.com/WindowsAPICodePack/Release/ProjectReleases.aspx?ReleaseId=3574

    Wenn Du das noch nicht benutzt, müsstest Du schauen, ob die Interop Deklarationen denen im API Pack entsprechen.
    Funktioniert da das WindowsFormsGlassDemo Projekt und das WpfGlassDemo Projekt?

    Dir sicher bekannt, aber trotzdem zur Vollständigkeit ... allgemeine Referenzen dazu findet man auch hier:

    [Desktop Window Manager (Windows)]
    http://msdn.microsoft.com/en-us/library/aa969540(VS.85).aspx


    ciao Frank
    Samstag, 10. Juli 2010 12:13
  • Weitere Informationen zu dem Thema:

    [Sie können in Windows Vista eventuell keine Effekte mit transparentem Glas aktivieren]
    http://support.microsoft.com/kb/923883

    Ausserdem sollte man vielleicht auch noch dazu sagen, dass Glass nur ab Vista Premium supported ist, nicht Vista Basic.

     


    ciao Frank
    Samstag, 10. Juli 2010 12:26
  • Hallo Frank,

    ich nutze Vista x64 Ultimate, daher sollte es Glas mäßig keine Probleme geben. Die beiden Demo Beispiele funktionieren, nutzen allerdings auch ExtendIntoClienArea statt EnabeBlurBehind. Die Interops sind auch identisch. Besonders komisch ist ja, dass es unter Windows 7 funktioniert und unter Vista nicht (auch bei anderen Vista Systemen nicht). Ich konnte leider nicht raus finden ob an der der dwmapi (bzw. dll) sich etwas geändert hat. Wenn ich statt EnableBlurBehind den Fensterrahmen aktiviere (ToolTipWindow) und ExtendIntoClientArea nutze funktioniert es ja auch :\, allerdings brauch ich den Rahmen nicht.

     

    Grüße Jan

    Samstag, 10. Juli 2010 19:28