zoukankan      html  css  js  c++  java
  • C# WinForm实现任务栏程序图标闪烁

    相信大家在用QQ的时候都会知道,你打开了QQ聊天窗口,如果窗口不是当前激活的窗口的话,收到QQ消息时,任务栏(不是托盘图标)上的图标会闪一下变成黄色(Win7默认主题下),用以通知用户有消息进来了,之前我用C#不知道这是怎么做的,用this.Activate()方法就是直接激活窗体,没有达到想要的效果。后来找到了两个API函数,可以实现这个功能。
    用到一个Windows的API函数。先来看看这个函数:

    BOOL FlashWindow(
      HWND hWnd,     // handle to window to flash
      BOOL bInvert   // flash status
    );
    View Code

    使用API函数FlashWindow可以闪烁显示指定窗口,让窗口在活动与非活动的状态之间切换,它有两个参数:hwnd和bInvert.其中,参数hwnd为要闪烁的窗口句柄,参数bInvert是一个bool变量,设为true时,程序窗口标题栏从活动切换到非活动状态、或反向切换,当设为false时,窗口标题栏还原为最初的状态。如果配合一个时间组件(Timer组件),以一定的时间间隔执行语句。

    在C#中调用很简单:

    [DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "FlashWindow")]
    private static extern void FlashWindow(IntPtr hwnd, bool bInvert);
     
    //直接调用FlashWindow即可
    FlashWindow(this.Handle, true);
    View Code

    这样就可以实现了。这个是比较简单的,还有另外一个函数,可以实现闪烁次数的。

    BOOL WINAPI FlashWindowEx(
      PFLASHWINFO pfwi //flash status information
    );

    就是这个。
    参数说明:
    PFLASHWINFO
    定义:

    typedef struct {
      UINT  cbSize;    //该结构的字节大小
      HWND  hwnd;      //要闪烁的窗口的句柄,该窗口可以是打开的或最小化的
      DWORD dwFlags;   //闪烁的状态
      UINT  uCount;    //闪烁窗口的次数
      DWORD dwTimeout; //窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
    } FLASHWINFO, *PFLASHWINFO;

    成员:

    dwFlags:
    //FLASHW_ALL-------0x00000003 同时闪烁窗口标题和窗口的任务栏按钮,相当于FALSHW_CAPTION | FLASHW_TRAY
    //FLASHW_CAPTION---0x00000001 闪烁窗口的标题
    //FLASHW_STOP------0 停止闪烁,系统将重置窗口到其初始状态
    //FLASHW_TIMER-----0x00000004 不停地闪烁,直到FLASHW_STOP标志被设置
    //FLASHW_TIMERNOFG-0x0000000C 不停地闪烁,直到窗口前端显示
    //FLASHW_TRAY------0x00000002 闪烁窗口的任务栏按钮

     返回值:
    返回值表示调用FlashWindowEx函数之前窗口的活动状态,若指定窗口在调用函数之前是激活的,那么返回非零值,否则返回零值。

    在C#中调用的例子:

    [DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "FlashWindowEx")]
    private static extern void FlashWindowEx(ref FLASHWINFO pwfi);
    public struct FLASHWINFO
    {
        public UInt32 cbSize;//该结构的字节大小
        public IntPtr hwnd;//要闪烁的窗口的句柄,该窗口可以是打开的或最小化的
        public UInt32 dwFlags;//闪烁的状态
        public UInt32 uCount;//闪烁窗口的次数
        public UInt32 dwTimeout;//窗口闪烁的频度,毫秒为单位;若该值为0,则为默认图标的闪烁频度
    }
    public const UInt32 FLASHW_TRAY = 2;
    public const UInt32 FLASHW_TIMERNOFG = 12;
    private void FlashWin()
    {
        FLASHWINFO fInfo = new FLASHWINFO();
        fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
        fInfo.hwnd = this.Handle;
        fInfo.dwFlags = FLASHW_TRAY | FLASHW_TIMERNOFG;
        fInfo.uCount = 3;// UInt32.MaxValue;
        fInfo.dwTimeout = 500;
        FlashWindowEx(ref fInfo);
    }
    View Code

     以上例子只要调用FlashWin()可实现闪烁。

    转载自:http://www.hejingzong.cn/blog/viewBlog_59.aspx

  • 相关阅读:
    高效 JavaScript
    什么是QName【转】
    gson的简单使用方法
    SWT的FormLayout
    SWT/JFace常用组件容器类
    更改swing应用程序标题栏默认图标
    面试也是自己对自己的面试
    关于Android图片cache处理方法
    【Java】_2_Java程序入门第二课
    【算法和数据结构】_9_线性结构_队列_续_1
  • 原文地址:https://www.cnblogs.com/onesmail/p/7227432.html
Copyright © 2011-2022 走看看