FlashWindowEx實現窗口在任務欄閃爍/變化顏色


效果類似QQ收到新的會話消息任務欄顏色變化

附2小段代碼:

[System.Runtime.InteropServices.DllImport( "user32.dll" )]     
   static    extern    int    FlashWindow   ( int    hwnd,    int    bInvert);   
   private    void    button1_Click( object    sender,   System.EventArgs   e)   
   {   
    FlashWindow( this .Handle.ToInt32(),1);  // 參數為1時啟動閃爍, 參數為0時停止閃爍 
   }
 
[System.Runtime.InteropServices.DllImport( "user32.dll" )]
public  static  extern  bool  FlashWindow(
               IntPtr hWnd,            //   handle   to   window  
               bool  bInvert        //   flash   status  
               );   
private  void  button1_Click( object  sender, EventArgs e)
{
   FlashWindow( this .Handle,  true );
}

 

當后台應用程序完成工作,可以通過閃動窗體來通知用戶.

1.利用窗體的Activate方法

this.Activate();

此方法會直接將目標窗體顯示在當前工作窗體的前面.並且當目標窗體被最小化時,使用此方法基本無效.

2.利用Windows API-FlashWindowEx

查了MSDN發現與Flash Window相關的API有兩個:

一個FlashWindow,函數原型為:

BOOL WINAPI FlashWindow( __in HWND hWnd, __in BOOL bInvert);

此API只閃動窗體一次,顯然不是我們想要的結果.

另外一個是FlashWindowEx,函數原型為:

BOOL WINAPI FlashWindowEx( __in PFLASHWINFO pfwi);

參數PFLASHWINFO 聲明為:

typedef struct {
UINT cbSize;
HWND hwnd;
DWORD dwFlags;
UINT uCount;
DWORD dwTimeout;
} FLASHWINFO, *PFLASHWINFO;
字段說明:

cbSize結構體FLASHWINFO的大小.

 

hwnd要閃動的窗體的句柄.窗體可以是打開的也可以是最小化的.

 

dwFlags

閃動的狀態/標志. 此參數可以是以下的值或值的組合(用或操作符"|"組合).

 

含義

FLASHW_ALL
0x00000003

閃動窗體標題和任務欄按鈕,等於將此參數設置為:

FLASHW_CAPTION | FLASHW_TRAY.

FLASHW_CAPTION
0x00000001
閃動窗體的標題.

FLASHW_STOP
0
停止閃動.系統將窗體恢復到初始狀態.

FLASHW_TIMER
0x00000004
連續不停的閃動,直到此參數被設置為:FLASHW_STOP

FLASHW_TIMERNOFG
0x0000000C
連續不停的閃動,直到窗體用戶被激活.通常用法將參數設置為: FLASHW_ALL | FLASHW_TIMERNOFG

FLASHW_TRAY
0x00000002
閃動任務欄按鈕

 

uCount閃動的次數.

 

dwTimeout閃動頻率,單位毫秒. 如果dwTimeout值為0, 函數使用光標的閃動頻率.

在C#中引用此API:

1.因為FlashWindowEx的參數是一個FLASHWINFO結構體類型,所以首先按FLASHWINFO格式聲明一個結構體:

public struct FLASHWINFO
{
public UInt32 cbSize;
public IntPtr hwnd;
public UInt32 dwFlags;
public UInt32 uCount;
public UInt32 dwTimeout;
}

2. 導入API原型:

[DllImport("user32.dll")]
static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

3.應用API:

private void button1_Click(object sender, EventArgs e)
{

//此處按API中參數dwFlags的取值范圍聲明常量,方便在使用API時調用,實際應用時可以考慮放到一個專門的文件中

public const UInt32 FLASHW_STOP = 0;
public const UInt32 FLASHW_CAPTION = 1;
public const UInt32 FLASHW_TRAY = 2;
public const UInt32 FLASHW_ALL = 3;
public const UInt32 FLASHW_TIMER = 4;
public const UInt32 FLASHW_TIMERNOFG = 12;

this.WindowState = FormWindowState.Minimized;

//准備參數

FLASHWINFO fInfo = new FLASHWINFO();

fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
fInfo.hwnd = this.Handle;
fInfo.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG;//這里是閃動窗標題和任務欄按鈕,直到用戶激活窗體
fInfo.uCount = UInt32.MaxValue;
fInfo.dwTimeout = 0;

//調用API

FlashWindowEx(ref fInfo);
}

至此,閃動窗體通知用戶的功能實現.

完整代碼為:

using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using System.Runtime.InteropServices;
 
 namespace FlashWindowEX
 {
     public struct FLASHWINFO
     {
         public UInt32 cbSize;
         public IntPtr hwnd;
         public UInt32 dwFlags;
         public UInt32 uCount;
         public UInt32 dwTimeout;
     } 
 
     public partial class Form1 : Form 
     {
         public const UInt32 FLASHW_STOP = 0;
         public const UInt32 FLASHW_CAPTION = 1;
         public const UInt32 FLASHW_TRAY = 2;
         public const UInt32 FLASHW_ALL = 3;
         public const UInt32 FLASHW_TIMER = 4;
         public const UInt32 FLASHW_TIMERNOFG = 12; 
 
         public Form1() 
         { 
             InitializeComponent(); 
         } 
 
         [DllImport("user32.dll")] 
         static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
 
         [DllImport("user32.dll")]
         static extern bool FlashWindow(IntPtr handle, bool invert); 
 
 
         private void button1_Click(object sender, EventArgs e) 
         {
             this.WindowState = FormWindowState.Minimized; 
 
             FLASHWINFO fInfo = new FLASHWINFO();
 
             fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
             fInfo.hwnd = this.Handle;
             fInfo.dwFlags = FLASHW_TRAY | FLASHW_TIMERNOFG;//這里是閃動窗標題和任務欄按鈕,直到用戶激活窗體
             fInfo.uCount = UInt32.MaxValue;
             fInfo.dwTimeout = 0; 
 
             FlashWindowEx(ref fInfo);
         }
     }
 }


免責聲明!

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



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