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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM