El fondo de vidrio Aero Windows está roto después de hibernar.¿Como puedo resolver esto?

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

  •  13-11-2019
  •  | 
  •  

Pregunta

Estoy desarrollando un programa en C # .NET 3.5 WPF. Tiene que trabajar en Windows XP, Windows Vista y Windows 7. En los sistemas de operación más recientes, quiero crear el fondo en Aero Glass. Así que este es solo un diseño especial. Después de hibernar, después de suspender o después de cambiar los deseos de Windows a un diseño básico y volver a Aero, se muestra completamente el vidrio agregado.

Mostrar vidrio a través de la clase de glasshelper (se puede encontrar con Google).

En realidad, veo 3 formas de resolver este problema. El primero es, sí para resolverlo. Pero leí en algún lugar, que este es un error en el código administrado de Windows, así que no tengo ninguna opción para sovelarlo. Corríjame, si estoy equivocado.

Así que tuve la idea de cerrar la ventana cada vez que se minimiza y se reconstruye por completo, cuando se usa la próxima vez.

que funciona bastante bien. Después de hibernar, la ventana aún se muestra en Black, pero no tengo que renunciar a la aplicación, todavía puedo minimizarla y maximizarlo nuevamente.

Ahora veo formas de formas:

1) Cierro la ventana cada vez que la computadora suspende, hiberuena o cambia el diseño. Y lo abro la ventana de nuevo, cuando se guarda. Pero, ¿cómo puedo manejar esto?

2) Acepto, que la ventana se mostrará en negro, hasta que alguien lo minimiga. (No es mi favorito) pero luego recibo un nuevo problema: el botón en la barra de tareas. (No el icono de la bandeja). Necesito que se muestre permanentemente. En WinXP, lo necesito para abrir la ventana, cuando se minimice. ¡Y especialmente en Win7 lo necesito porque quiero usar algunas de las nuevas ventajas de la superarbar! (La vista previa por Hoovering no será la ventana, será una imagen estática).

¡Gracias a todos, por ayudarme!

¿Fue útil?

Solución 2

OK, gracias a todos!¡Pero creo que encontré mi propia solución!

MANEJO LOS MENSAJES: WM_DWMCOMPOSITION CAMINOS (0x031E) & WM_THEMECED (0x031A)

y en la captura de uno de esos mensajes Simplemente le asigna el vidrio nuevamente o un nuevo fondo dependiendo de DWMISCOMPOSITIONEnabled ().

En realidad tengo algo similar a lo siguiente:

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

obtengo el hwnd.

lo engancho.

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

Hago que el fondo de la ventana de WPF transparente, porque más tarde, en la función WNDPROC solo podré acceder a mi fondo HWND (Win32).

window.Background = Brushes.Transparent;

y ahora solo tengo que asignar el estilo por primera vez:

ApplyTheme(hwnd);

eso es todo!Funciona perfectamente para mí (Gana 64 Premium en el hogar) Después de deshabilitar o habilitar Aero, cambiar entre diferentes estilos AERO o no Aero o Hibernate, por lo que es exactamente lo que estaba buscando.¡Gracias, por tus grandes ideas!

Otros consejos

Intente manejar el mensaje WM_NCCALCSIZE y reduzca el área del cliente (nccalcsize_params.rgrc0) por un píxel.Lo digo en serio.Encontré que esta solución se usa en Google Chrome y funciona bien para mí también.

Es posible que desee echar un vistazo a la biblioteca de integración de shell de WPF . Puedo recordar que hubo problemas similares con esa biblioteca debido a un error en el administrador de la ventana de escritorio en Windows 7. La biblioteca tiene su origen disponible para que pueda echar un vistazo a cómo lo manejan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top