none
Как вызвать мигание в панели задач Windows 7. Работа с панелью задач RRS feed

  • Вопрос

  • В свое время панель задач Windows 7 звали SuperBar :)

    Присутствуют ли в .Net 4.0 (WPF) стандартные вызовы -мигания панели задач, остановки мигания, вывод прогресса?

    Как сделать эти вызовы, мог бы кто-нибудь подсказать? А как создается панель переходов?

    Я пробовал через

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    Не заработало. Да и хочется более изящного решения. Ну если только через WinAPI, то ничего не поделаешь, разберусь почему не работает..
    13 марта 2015 г. 11:21

Ответы

  • Как минимум так:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows;
    using System.Windows.Interop;
    
    namespace SuperBarNameSpace
    {
        public static class WindowExtensions
        {
            #region Window Flashing API Stuff
    
            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);
    
            #endregion
    
            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);
            }
        }
    }
    

    Вызовы:

    this.FlashWindow();

    this.StopFlashingWindow();


    • Помечено в качестве ответа Evgeniy Nikulov 13 марта 2015 г. 17:50
    13 марта 2015 г. 17:50