notyfikacje

Sposobów na komunikację aplikacji z użytkownikiem jest kilka. Powiadomieniem o zakończeniu długo trwającej operacji (np. ściąganie pliku, filtrowanie obrazu, wykonywanie złożonych obliczeń matematycznych) może być informacja na pasku statusu, tzw. „balloon tip”, odegranie dźwięku lub wyświetlenie okna modalnego (nie zalecam).
Co jednak w przypadku, gdy użytkownik zminimalizował okno? Może dowiedzieć się o zakończeniu operacji gdy przypomni sobie o jej wykonywaniu (co w dobie portali społecznościowych i gier flash może trwać długo). Wspomniane wcześniej modalne okno dialogowe skutecznie powiadomi użytkownika o zakończeniu operacji, jednocześnie niwecząc plany uzyskania rekordu w kolejnym klonie Tower Defense.

Poniżej prosty sposób (zamknięty w statyczną klasę) jak (tak jak najczęściej komunikatory sieciowe, typu GG lub AQQ)  „migać” oknem aplikacji, procedura i opisy struktur zaczerpnięte z serwisu pinvoke.net.

using System.Runtime.InteropServices;
using System;

namespace MardiGras
{
    public static class FlashWindow
    {
        [DllImport("user32.dll")]
        private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

        private struct FLASHWINFO
        {
            public uint cbSize;
            public IntPtr hwnd;
            public uint dwFlags;
            public uint uCount;
            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="form">The Form (Window) to Flash.</param>
        /// <returns></returns>
        public static bool Flash(System.Windows.Forms.Form form)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0);
            return FlashWindowEx(ref fi);
        }

        private static FLASHWINFO Create_FLASHWINFO(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="form">The Form (Window) to Flash.</param>
        /// <param name="count">The number of times to Flash.</param>
        /// <returns></returns>
        public static bool Flash(System.Windows.Forms.Form form, uint count)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL, count, 0);
            return FlashWindowEx(ref fi);
        }

        /// <summary>
        /// Start Flashing the specified Window (form)
        /// </summary>
        /// <param name="form">The Form (Window) to Flash.</param>
        /// <returns></returns>
        public static bool Start(System.Windows.Forms.Form form)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL, uint.MaxValue, 0);
            return FlashWindowEx(ref fi);
        }

        /// <summary>
        /// Stop Flashing the specified Window (form)
        /// </summary>
        /// <param name="form"></param>
        /// <returns></returns>
        public static bool Stop(System.Windows.Forms.Form form)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_STOP, uint.MaxValue, 0);
            return FlashWindowEx(ref fi);
        }
    }
}

Wodotryski tego rodzaju należy stosować z umiarem, w końcu nawet najlepsze ciastko ze zbyt dużą ilością lukru staje się nie do przełknięcia. Tą cukierniczo-inżynieryjną uwagą żegnam.

Be Sociable, Share!
czoper opublikowano dnia 2010-3-2 Kategoria: Programowanie | Tagi:, ,

Zostaw odpowiedź

(Ctrl + Enter)