2012-01-19 15 views
14

Sto usando C#/WPF per creare un'applicazione. In quell'applicazione, voglio lampeggiare la finestra se si verifica un evento particolare in modo che l'utente di quell'applicazione sappia che qualcosa è successo. Come posso ottenere questo nella mia applicazione WPF C#.Forza finestra a lampeggiare quando si verifica un evento particolare in C#/WPF

Come in Yahoo Messenger, se si riceve un messaggio, la finestra del messaggio lampeggia per ottenere il focus, voglio utilizzare tale effetto nella mia applicazione.

+0

Sono nuovo in WPF e ho cercato su google ma non ho trovato nessuna soluzione facile che riesco a capire facilmente ... –

+0

@Marco Quel collegamento mostra come far lampeggiare una finestra nel taskba r, non come fare lampeggiare una finestra di dimensioni regolari. – Rachel

risposta

27

lampeggiante la finestra e barra delle applicazioni in modo simile a IM notifiche può essere realizzato in WPF utilizzando il seguente codice. Esso utilizza PlatformInvoke per chiamare la funzione WinAPI FlashWindowEx utilizzando la maniglia Win32 del WPF Application.Current.MainWindow

Codice

public class FlashWindowHelper 
{ 
    private IntPtr mainWindowHWnd; 
    private Application theApp; 

    public FlashWindowHelper(Application app) 
    { 
     this.theApp = app; 
    } 

    public void FlashApplicationWindow() 
    { 
     InitializeHandle(); 
     Flash(this.mainWindowHWnd, 5); 
    } 

    public void StopFlashing() 
    { 
     InitializeHandle(); 

     if (Win2000OrLater) 
     { 
      FLASHWINFO fi = CreateFlashInfoStruct(this.mainWindowHWnd, FLASHW_STOP, uint.MaxValue, 0); 
      FlashWindowEx(ref fi); 
     } 
    } 

    private void InitializeHandle() 
    { 
     if (this.mainWindowHWnd == IntPtr.Zero) 
     { 
      // Delayed creation of Main Window IntPtr as Application.Current passed in to ctor does not have the MainWindow set at that time 
      var mainWindow = this.theApp.MainWindow; 
      this.mainWindowHWnd = new System.Windows.Interop.WindowInteropHelper(mainWindow).Handle; 
     } 
    } 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool FlashWindowEx(ref FLASHWINFO pwfi); 

    [StructLayout(LayoutKind.Sequential)] 
    private struct FLASHWINFO 
    { 
     /// <summary> 
     /// The size of the structure in bytes. 
     /// </summary> 
     public uint cbSize; 
     /// <summary> 
     /// A Handle to the Window to be Flashed. The window can be either opened or minimized. 
     /// </summary> 
     public IntPtr hwnd; 
     /// <summary> 
     /// The Flash Status. 
     /// </summary> 
     public uint dwFlags; 
     /// <summary> 
     /// The number of times to Flash the window. 
     /// </summary> 
     public uint uCount; 
     /// <summary> 
     /// The rate at which the Window is to be flashed, in milliseconds. If Zero, the function uses the default cursor blink rate. 
     /// </summary> 
     public uint dwTimeout; 
    } 

    /// <summary> 
    /// Stop flashing. The system restores the window to its original stae. 
    /// </summary> 
    public const uint FLASHW_STOP = 0; 

    /// <summary> 
    /// Flash the window caption. 
    /// </summary> 
    public const uint FLASHW_CAPTION = 1; 

    /// <summary> 
    /// Flash the taskbar button. 
    /// </summary> 
    public const uint FLASHW_TRAY = 2; 

    /// <summary> 
    /// Flash both the window caption and taskbar button. 
    /// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags. 
    /// </summary> 
    public const uint FLASHW_ALL = 3; 

    /// <summary> 
    /// Flash continuously, until the FLASHW_STOP flag is set. 
    /// </summary> 
    public const uint FLASHW_TIMER = 4; 

    /// <summary> 
    /// Flash continuously until the window comes to the foreground. 
    /// </summary> 
    public const uint FLASHW_TIMERNOFG = 12; 

    /// <summary> 
    /// Flash the spacified Window (Form) until it recieves focus. 
    /// </summary> 
    /// <param name="hwnd"></param> 
    /// <returns></returns> 
    public static bool Flash(IntPtr hwnd) 
    { 
     // Make sure we're running under Windows 2000 or later 
     if (Win2000OrLater) 
     { 
      FLASHWINFO fi = CreateFlashInfoStruct(hwnd, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0); 

      return FlashWindowEx(ref fi); 
     } 
     return false; 
    } 

    private static FLASHWINFO CreateFlashInfoStruct(IntPtr handle, uint flags, uint count, uint timeout) 
    { 
     FLASHWINFO fi = new FLASHWINFO(); 
     fi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fi)); 
     fi.hwnd = handle; 
     fi.dwFlags = flags; 
     fi.uCount = count; 
     fi.dwTimeout = timeout; 
     return fi; 
    } 

    /// <summary> 
    /// Flash the specified Window (form) for the specified number of times 
    /// </summary> 
    /// <param name="hwnd">The handle of the Window to Flash.</param> 
    /// <param name="count">The number of times to Flash.</param> 
    /// <returns></returns> 
    public static bool Flash(IntPtr hwnd, uint count) 
    { 
     if (Win2000OrLater) 
     { 
      FLASHWINFO fi = CreateFlashInfoStruct(hwnd, FLASHW_ALL | FLASHW_TIMERNOFG, count, 0); 

      return FlashWindowEx(ref fi); 
     }    

     return false; 
    } 

    /// <summary> 
    /// A boolean value indicating whether the application is running on Windows 2000 or later. 
    /// </summary> 
    private static bool Win2000OrLater 
    { 
     get { return Environment.OSVersion.Version.Major >= 5; } 
    } 
} 

Uso

var helper = new FlashWindowHelper(Application.Current); 

// Flashes the window and taskbar 5 times and stays solid 
// colored until user focuses the main window 
helper.FlashApplicationWindow(); 

// Cancels the flash at any time 
helper.StopFlashing(); 
+0

Questo è un ottimo esempio ... tranne per me l'icona della barra delle applicazioni lampeggia solo una volta per meno di un secondo :( – Julien

+0

Realmente? Su quale sistema operativo ho usato il precedente (era su WinXP mente) e sarebbe lampeggiare per un buon 5 secondi, quindi resta arancione fisso –

+0

Mi scuso, la maniglia della finestra utilizzata dalla classe non era corretta per il mio progetto.Modifica leggermente per accettare maniglie personalizzate e tutto va bene.grazie mille! – Julien

6

È possibile utilizzare la classe TaskBarItem per far lampeggiare l'icona della barra delle applicazioni dell'app. Qui ci sono alcune risorse che vi aiuteranno a raggiungere esso:
- http://social.msdn.microsoft.com/Forums/en/wpf/thread/369bc5ee-a9a7-493f-978f-27a8ddedea06
- http://www.bobpowell.net/flashbar.htm

Poi si può flash, shake, fade-in fade-out o whatever one of the other zillion FX utilizzando WPF animazioni. È molto semplice e non richiede quasi alcun codice, se si dispone di Expression Blend, il lavoro è reso ancora più semplice.

+0

voglio solo lampeggiare la finestra di WPF non voglio mostrare il progresso. Io uso questo codice ma non mi ha aiutato nel mio compito. Puoi semplicemente dirmi come faccio a lampeggiare la finestra WPF su un particolare evento, sia che clicchi sul pulsante o su una finestra temporale specifica lampeggi. –

+0

Risposta aggiornata. Non ho fatto riferimento alla barra di avanzamento, puoi far lampeggiare l'icona della barra delle applicazioni, tranne che in aggiunta alla finestra che lampeggia. – Shimmy

+1

Alcuni link morti, li risolvono. –

Problemi correlati