.net - modales - ventana modal c#
¿Cómo hacer que una ventana de WPF parpadee en la barra de tareas? (2)
En un momento dado, mi aplicación WPF necesita la atención del usuario. Sé que es posible hacer que el icono de la barra de tareas de Windows 7 parpadee con un color amarillo.
Lo intenté hasta ahora:
-
Window.Activate
Intentos para traer la ventana al primer plano y activarla. -
Window.Focus
Intenta establecer el foco en este elemento.
¿Alguna sugerencia?
Aquí hay una posible solución: http://www.jarloo.com/flashing-a-wpf-window/
En el ejemplo de código, se crean dos métodos de extensiones para la clase Window: FlashWindow y StopFlashingWindow:
private const UInt32 FLASHW_STOP = 0; //Stop flashing. The system restores the window to its original state. private const UInt32 FLASHW_CAPTION = 1; //Flash the window caption.
private const UInt32 FLASHW_TRAY = 2; //Flash the taskbar button.
private const UInt32 FLASHW_ALL = 3; //Flash both the window caption and taskbar button.
private const UInt32 FLASHW_TIMER = 4; //Flash continuously, until the FLASHW_STOP flag is set.
private const UInt32 FLASHW_TIMERNOFG = 12; //Flash continuously until the window comes to the foreground.
[StructLayout(LayoutKind.Sequential)]
private struct FLASHWINFO
{
public UInt32 cbSize; //The size of the structure in bytes.
public IntPtr hwnd; //A Handle to the Window to be Flashed. The window can be either opened or minimized.
public UInt32 dwFlags; //The Flash Status.
public UInt32 uCount; // number of times to flash the window
public UInt32 dwTimeout; //The rate at which the Window is to be flashed, in milliseconds. If Zero, the function uses the default cursor blink rate.
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
public static void FlashWindow(this Window win, UInt32 count = UInt32.MaxValue)
{
//Don''t flash if the window is active
if (win.IsActive) return;
WindowInteropHelper h = new WindowInteropHelper(win);
FLASHWINFO info = new FLASHWINFO
{
hwnd = h.Handle,
dwFlags = FLASHW_ALL | FLASHW_TIMER,
uCount = count,
dwTimeout = 0
};
info.cbSize = Convert.ToUInt32(Marshal.SizeOf(info));
FlashWindowEx(ref info);
}
public static void StopFlashingWindow(this Window win)
{
WindowInteropHelper h = new WindowInteropHelper(win);
FLASHWINFO info = new FLASHWINFO();
info.hwnd = h.Handle;
info.cbSize = Convert.ToUInt32(Marshal.SizeOf(info));
info.dwFlags = FLASHW_STOP;
info.uCount = UInt32.MaxValue;
info.dwTimeout = 0;
FlashWindowEx(ref info);
}
Visite http://www.jarloo.com/flashing-a-wpf-window/ para obtener la fuente completa.
Escenario bastante interesante. Pensé que sería algo simple. Tendré que marcar esta pregunta en el caso de que alguna vez tenga que hacer algo similar :)
Es mejor utilizar la función de Windows 7 que está diseñada para este propósito: los iconos de superposición de la barra de tareas. http://10rem.net/blog/2009/12/09/overlaying-icons-on-the-windows-7-taskbar-with-wpf-4 es uno de los muchos lugares donde puede ver cómo hacerlo.
Si se necesita atención como parte de un proceso de ejecución prolongada, usaría una barra de progreso superpuesta de la barra de tareas (que también es fácil de hacer en WPF) y cambiaría su estado de Normal a Pausado o Error que se muestra en amarillo y rojo respectivamente. Eso llamará la atención del usuario.