WinForms/C#: Anwendung in der Taskleiste “blinken” lassen

5. Januar 2011

Implementiert man als Entwickler eine WinForms-Anwendung, die einen langlaufenden Prozess beinhaltet (z.B. zum Import größerer Datenmengen), so stellt sich die Frage, wie der Abschluss des Prozesses dem Anwender bekannt gemacht wird.

Langlaufende Prozesse wird ein Anwender zwar initial anstoßen, dann aber zu anderen Aufgaben übergehen und die Anwendung in den Hintergrund verlagern. Daher ist es oftmals sinnvoll, den Abschluss des Prozesses durch “Blinken” des Anwendungssymbols in der Taskleiste deutlich zu machen.

Hier kommt man mit WinForms-Mitteln allein nicht aus und muss auf Win32-API-Funktionen zurückgreifen. Folgender Code realisiert z.B. ein dauerhaftes Blinken des Anwendungs-Icons in der Taskleiste, bis die Anwendung in den Vordergrund geholt wird:

   1: public static class FlashWindowHelper

   2: {

   3:     #region Helper Structures

   4:         

   5:     [StructLayout(LayoutKind.Sequential)]

   6:     private struct FLASHWINFO

   7:     {

   8:         public uint cbSize;

   9:         public IntPtr hwnd;

  10:         public uint dwFlags;

  11:         public uint uCount;

  12:         public uint dwTimeout;

  13:     }

  14:  

  15:     #endregion

  16:  

  17:     #region Win32 API Members

  18:         

  19:     [DllImport("user32.dll")]

  20:     [return:MarshalAs(UnmanagedType.Bool)]

  21:     private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

  22:     public const uint FLASHW_ALL = 3;

  23:     public const uint FLASHW_TIMERNOFG = 12;

  24:         

  25:     #endregion

  26:         

  27:     #region Public Methods

  28:         

  29:     public static bool Flash(Form form)

  30:     {

  31:         // funktioniert nur unter Windows 2000 oder sp„ter

  32:         if (IsWin2000OrLater())

  33:         {

  34:             FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0);

  35:             return FlashWindowEx(ref fi);

  36:         }

  37:         return false;

  38:     }

  39:         

  40:     #endregion

  41:         

  42:     #region Private Helper Methods

  43:         

  44:     private static FLASHWINFO Create_FLASHWINFO(IntPtr handle, uint flags, uint count, uint timeout)

  45:     {

  46:         FLASHWINFO fi = new FLASHWINFO();

  47:         fi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fi));

  48:         fi.hwnd = handle;

  49:         fi.dwFlags = flags;

  50:         fi.uCount = count;

  51:         fi.dwTimeout = timeout;

  52:         return fi;

  53:     }

  54:         

  55:     private static bool IsWin2000OrLater()

  56:     {

  57:         return Environment.OSVersion.Version.Major >= 5;

  58:     }

  59:         

  60:     #endregion

  61: }

Auf diese Weise kann die gewünschte Funktionalität leicht implementiert werden. Die Grundstruktur dieser Klasse stammt von C#: Flash Window in Taskbar via Win32 FlashWindowEx