내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-10 03:23

제목

[WPF] 프로그램이 비활성화된 상태에서 작업표시줄 아이콘 Flash효과 내기


프로그램이 비활성화 된 상태에서 알림 등을 받아 사용자에게 시각적 효과를 보이게 처리 할 수 있다.
윈도우에서 지원하는 API를 사용하여 다음과 같이 FlashWindowHelper 클래스를 생성한다.

FlashWindowHelper.cs

using System;
using System.Runtime.InteropServices;
using System.Windows;
 
namespace IntegratedManagementConsole.Helper
{
    public class FlashWindowHelper
    {
        private IntPtr _mainWindowHWnd;
        private Application _theApp;
 
        public FlashWindowHelper(Application app)
        {
            _theApp = app;
        } 
 
        public void FlashApplicationWindow()
        {
            this.InitializeHandle();
            Flash(_mainWindowHWnd, 5);
        }
 
        public void StopFlashing()
        {
            this.InitializeHandle();
 
            if (Win2000OrLater)
            {
                FLASHWINFO fi = CreateFlashInfoStruct(_mainWindowHWnd,
FLASHW_STOP, uint.MaxValue, 0);
                FlashWindowEx(ref fi);
            }
        }
 
        private void InitializeHandle()
        {
            if (_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
                Window mainWindow = _theApp.MainWindow;
                _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;}
        }
    }
}
cs

위 처럼 기본 FlashWindowHelper 클래스를 사용하여 프로그램이 비활성화 상태일 경우 작업표시줄의 아이콘에 Flash효과를 줄 수 있다.

MainWindow.xaml.cs

/// <summary>
/// 작업표시줄 프로그램 아이콘 Flash
/// </summary>
private FlashWindowHelper _flashWindowHelper;
_flashWindowHelper = new FlashWindowHelper(Application.Current);
cs

위 처럼 FlashWindowHelper 클래스를 초기화 한 후 프로그램 내부에서 알림이 발생 했을 경우 Flash효과를 실행하면 된다.
프로그램이 비활성화 상태일 겨우(다른 프로그램 작업중) 다음 메서드가 호출 되면 해당 프로그램의 작업표시줄의 아이콘에 Flash효과가 실행된다.
(현재 프로그램이 활성화 상태라면 아래 메서드가 호출되어도 아무 반응이 없다.)

_flashWindowHelper.FlashApplicationWindow();
cs


출처1

출처2