今天用C#做一個類似QQ的通訊軟件,因為有時候收到消息了沒有注意到,所以想在收到消息後實現任務欄一閃一閃,最後為高亮橘黃色,就像QQ發消息時那樣。經過反復搜索和查詢API,發現任務欄閃動並停留需要使用這個函數:
public static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
實現的關鍵代碼如下:
[DllImport("user32.dll")]
public static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
public enum falshType: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 //未激活時閃爍任務欄直到發送停止標志或者窗體被激活,停止後高亮
}
public static bool flashTaskBar(IntPtr hWnd, falshType type)
{
FLASHWINFO fInfo = new FLASHWINFO();
fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
fInfo.hwnd = hWnd;//要閃爍的窗口的句柄,該窗口可以是打開的或最小化的
fInfo.dwFlags = (uint)type;//閃爍的類型
fInfo.uCount = UInt32.MaxValue;//閃爍窗口的次數
fInfo.dwTimeout = 0; //窗口閃爍的頻度,毫秒為單位;若該值為0,則為默認圖標的閃爍頻度
return FlashWindowEx(ref fInfo);
}
下面的調用:未激活時閃爍任務欄,直到發送停止標志或者窗體被激活,停止後高亮激活後正常,這個跟QQ是一樣的,激活窗口是停止高亮的事件:
flashTaskBar(this.Handle, falshType.FLASHW_TIMERNOFG);
但是QQ有一個缺點是,在會話窗口處理激活狀態時不閃動,這樣有時候就沒留意到對方發過來的消息。所以如果想做成無論是否激活了窗體,只要有新消息的時候任務欄就閃動,直到用戶輸入了文字才不閃動。這可以用下面這種調用:
flashTaskBar(this.Handle, falshType.FLASHW_TIMER );
並且當用戶輸入時會觸發事件,在事件處理函數中加入以下調用就可以了:
下面的調用:停止閃爍,停止後如果未激活窗口,窗口高亮,如果窗口處於激活狀態,停止閃爍,不會高亮
flashTaskBar(this.Handle, falshType.FLASHW_STOP);
另外,尚未找到方法讓激活的窗口一直高亮,看起來激活窗口一定會取消高亮。