• C#闪动任务栏的方法


    用FlashWindowEx可以实现窗口的闪烁,结构如下:

    /// <summary>
            /// 闪烁窗口
            /// </summary>
            /// <param name="pwfi">窗口闪烁信息结构</param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
            /// <summary>
            /// 闪烁类型
            /// </summary>
            public enum flashType : uint
            {
                FLASHW_STOP = 0, //停止闪烁
                FALSHW_CAPTION = 1, //只闪烁标题
                FLASHW_TRAY = 2, //只闪烁任务栏
                FLASHW_ALL = 3, //标题和任务栏同时闪烁
                FLASHW_PARAM1 = 4,
                FLASHW_PARAM2 = 12,
                FLASHW_TIMER = FLASHW_TRAY | FLASHW_PARAM1, //无条件闪烁任务栏直到发送停止标志或者窗口被激活,如果未激活,停止时高亮
                FLASHW_TIMERNOFG = FLASHW_TRAY | FLASHW_PARAM2 //未激活时闪烁任务栏直到发送停止标志或者窗体被激活,停止后高亮
            }
            /// <summary>
            /// 包含系统应在指定时间内闪烁窗口次数和闪烁状态的信息
            /// </summary>
            public struct FLASHWINFO
            {
                /// <summary>
                /// 结构大小
                /// </summary>
                public uint cbSize;
                /// <summary>
                /// 要闪烁或停止的窗口句柄
                /// </summary>
                public IntPtr hwnd;
                /// <summary>
                /// 闪烁的类型
                /// </summary>
                public uint dwFlags;
                /// <summary>
                /// 闪烁窗口的次数
                /// </summary>
                public uint uCount;
                /// <summary>
                /// 窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
                /// </summary>
                public uint dwTimeout;
            }
            /// <summary>
            /// 闪烁窗口
            /// </summary>
            /// <param name="hWnd">窗口句柄</param>
            /// <param name="type">闪烁类型</param>
            /// <returns></returns>
            public static bool FlashWindowEx(IntPtr hWnd, flashType type)
            {
                FLASHWINFO fInfo = new FLASHWINFO();
                fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
                fInfo.hwnd = hWnd;//要闪烁的窗口的句柄,该窗口可以是打开的或最小化的
                fInfo.dwFlags = (uint)type;//闪烁的类型
                fInfo.uCount = int.MaxValue;//闪烁窗口的次数
                fInfo.dwTimeout = 0; //窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
                return FlashWindowEx(ref fInfo);
            }
    View Code

    调用如下:

      //第一个闪动判断窗体是否被激活
                       var isTrue= FlashWindowEx(val.Handle, flashType.FLASHW_TIMERNOFG);
                        if (isTrue == false)
                        {
                            //如果窗口未激活,那么就停止闪烁,高亮
                            FlashWindowEx(val.Handle, flashType.FLASHW_STOP);
                        }
    View Code

    如果只是调用这句FlashWindowEx(val.Handle, flashType.FLASHW_TIMERNOFG),也能实现闪动的效果,但是这个有一定的问题。

    就是如果当前有2个或者2个以上的窗口都在闪动,当其中任意一个窗口被激活,其它的窗口闪动效果也取消了,所有就需要加入下面一句话:

    if (isTrue == false)
    {
    //如果窗口未激活,那么就停止闪烁,高亮
    FlashWindowEx(val.Handle, flashType.FLASHW_STOP);
    }

    if语句的意思是如果窗体闪动的时候已经被激活了,那么就不用闪动当前任务栏。

    但是在wpf中停止闪烁有时会无效,没有起到作用,那么最保险的做法就是如下:

    FlashWindowEx(handel, flashType.FLASHW_TIMER);

    如果这样,需要修改闪动次数为1次:fInfo.uCount = 1;//闪烁窗口的次数,新的代码如下:

    /// <summary>
            /// 闪烁窗口
            /// </summary>
            /// <param name="pwfi">窗口闪烁信息结构</param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
            /// <summary>
            /// 闪烁类型
            /// </summary>
            public enum flashType : uint
            {
                FLASHW_STOP = 0, //停止闪烁
                FALSHW_CAPTION = 1, //只闪烁标题
                FLASHW_TRAY = 2, //只闪烁任务栏
                FLASHW_ALL = 3, //标题和任务栏同时闪烁
                FLASHW_PARAM1 = 4,
                FLASHW_PARAM2 = 12,
                FLASHW_TIMER = FLASHW_TRAY | FLASHW_PARAM1, //无条件闪烁任务栏直到发送停止标志或者窗口被激活,如果未激活,停止时高亮
                FLASHW_TIMERNOFG = FLASHW_TRAY | FLASHW_PARAM2 //未激活时闪烁任务栏直到发送停止标志或者窗体被激活,停止后高亮
            }
            /// <summary>
            /// 包含系统应在指定时间内闪烁窗口次数和闪烁状态的信息
            /// </summary>
            public struct FLASHWINFO
            {
                /// <summary>
                /// 结构大小
                /// </summary>
                public uint cbSize;
                /// <summary>
                /// 要闪烁或停止的窗口句柄
                /// </summary>
                public IntPtr hwnd;
                /// <summary>
                /// 闪烁的类型
                /// </summary>
                public uint dwFlags;
                /// <summary>
                /// 闪烁窗口的次数
                /// </summary>
                public uint uCount;
                /// <summary>
                /// 窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
                /// </summary>
                public uint dwTimeout;
            }
            /// <summary>
            /// 闪烁窗口
            /// </summary>
            /// <param name="hWnd">窗口句柄</param>
            /// <param name="type">闪烁类型</param>
            /// <returns></returns>
            public static bool FlashWindowEx(IntPtr hWnd, flashType type)
            {
                FLASHWINFO fInfo = new FLASHWINFO();
                fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
                fInfo.hwnd = hWnd;//要闪烁的窗口的句柄,该窗口可以是打开的或最小化的
                fInfo.dwFlags = (uint)type;//闪烁的类型
                fInfo.uCount = 1;//闪烁窗口的次数
                fInfo.dwTimeout = 0; //窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
                return FlashWindowEx(ref fInfo);
            }
    //调用代码:
     var isTrue= FlashWindowEx(handel, flashType.FLASHW_TIMERNOFG);
                        if (isTrue == false)
                        {
                            //如果窗口未激活,那么就停止闪烁,高亮
                            FlashWindowEx(handel, flashType.FLASHW_TIMER);
                        }
    View Code
  • 相关阅读:
    The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make s
    ScrollView 定位
    Fragment获取Activity,Activity获取Fragment
    Popupwindow全屏问题
    bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)
    bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)
    2016vijos 1-3 兔子的晚会(生成函数+倍增FWT)
    bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)
    bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋
    cdqz2017-test10-加帕里图书馆(区间DP & 简单容斥)
  • 原文地址:https://www.cnblogs.com/sczmzx/p/5034968.html
Copyright © 2020-2023  润新知