相信大家在用QQ的時候都會知道,你打開了QQ聊天窗口,如果窗口不是當前激活的窗口的話,收到QQ消息時,任務欄(不是托盤圖標)上的圖標會閃一下變成黃色(Win7默認主題下),用以通知用戶有消息進來了,之前我用C#不知道這是怎么做的,用this.Activate()方法就是直接激活窗體,沒有達到想要的效果。后來找到了兩個API函數,可以實現這個功能。
用到一個Windows的API函數。先來看看這個函數:

BOOL FlashWindow( HWND hWnd, // handle to window to flash BOOL bInvert // flash status );
使用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);
這樣就可以實現了。這個是比較簡單的,還有另外一個函數,可以實現閃爍次數的。
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); }
以上例子只要調用FlashWin()可實現閃爍。
轉載自:http://www.hejingzong.cn/blog/viewBlog_59.aspx