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

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

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

附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 );
}

 

當後臺應用程序完成工做,能夠經過閃動窗體來通知用戶.this

1.利用窗體的Activate方法url

this.Activate();spa

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

2.利用Windows API-FlashWindowExcode

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

一個FlashWindow,函數原型爲:htm

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

此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);
}
}
}
相關文章
相關標籤/搜索