怎樣閃爍應用程式在工作列上的按鈕

2021-04-01 20:06:25 字數 2876 閱讀 8087

如果您建立的應用程式是執行在windows 98或更高版本作業系統上,您可以通過呼叫api函式flashwindowex並賦給它乙個flashwinfo結構體來實現.  而如果是執行在windows 95上則比較麻煩, 但您也可以通過使用乙個timer元件來實現想要的效果。

flashwindowex

當您呼叫api函式flashwindowex時,乙個tflashwinfo被用來控制windows實現該閃爍功能的資訊.  幸運的是,delphi已經為您封裝了該結構體。delphi中它被申明如下:

typetflashwinfo =recordcbsize : longint;

hwnd : longint;

dwflags : longint;

ucount : longint;

dwtimeout : longint;end;

您所需做的全部事情僅僅是填充和組裝該記錄型別,並呼叫api函式。本例中,我把兩者放在了乙個按鈕的onclick事件中,當然您也可以放置它們到任何合適的地方:

proceduretform1.button1click(sender: tobject);varfwinfo: tflashwinfo;beginfwinfo.cbsize := 20;

fwinfo.dwflags := flashw_all;

fwinfo.ucount := 10; // 閃爍的次數

fwinfo.dwtimeout := 0; // 速度以毫秒為單位, 0 預設為與指標閃爍的速率相同

flashwindowex(fwinfo); // 使它閃爍!end;

dwflags指示了閃爍的方式,下面是dwflags屬性的取值定義:

flashw_stop = 0      // 停止閃爍

flashw_caption = 1 // 閃爍視窗標題

flashw_tray = 2 // 閃爍工作列按鈕

flashw_all = 3 // 閃爍視窗標題與工作列按鈕

flashw_timer = 4 // 不停地閃爍,直到flashw_stop標誌設定

flashw_timernofg = 5 // 不停地閃爍直到視窗被前置

以上只有在windows 98或更高版本作業系統上才有效,如果您要在windows 95上實現,您就需要採取另一不同的途徑:

flashwindow

windows 95下 (並且delphi 3及更底版本幷包含適用的api封裝) 需要不同的途徑.  該作業系統下沒有flashwindowex這個api函式,您需要使用flashwindow來代替.  (flashwindow還能在更低版本的作業系統中被呼叫。)

但問題是flashwindow只能閃爍一次,所以要達到閃爍按鈕的目的就需要用到乙個timer元件。 當然,這樣一來也就加大了寶貴的系統資源開銷 - 但它能完成我們想要的效果。

proceduretform1.timer1timer(sender: tobject);beginend;
proceduretform1.button1click(sender: tobject);begintimer1.enabled := not timer1.enabled;end;
到此為止,兩種不同方法實現了相同的功能。

本示例貼出還沒幾分鐘,西蒙·克萊頓(simon clayton)就提出了乙個閃爍方法的建議——僅當應用程式不是當前活動的乙個時。  西蒙改寫如下:

我是這樣做的:

proceduretform1.timer1timer(sender: tobject);beginif(getforegroundwindow()<>form1.handle)thenbeginfwinfo.cbsize := 20;

fwinfo.dwflags := flashw_all;

fwinfo.ucount := 5;

fwinfo.dwtimeout := 0;

flashing := true;

flashwindowex(fwinfo);endelseif(flashing)thenbeginfwinfo.cbsize := 20;

fwinfo.dwflags := flashw_stop;

fwinfo.ucount := 0;

fwinfo.dwtimeout := 0;

flashwindowex(fwinfo);

flashing := false;end;end;

我也在form的onpaint事件中加入了一些停止閃爍的**:

proceduretform1.formpaint(sender: tobject);beginif(flashing)thenbeginfwinfo.cbsize := 20;

fwinfo.dwflags := flashw_stop;

fwinfo.ucount := 0;

fwinfo.dwtimeout := 0;

flashwindowex(fwinfo);end;end;

我現在要解決的唯一乙個問題是,如果我正我第二台顯示器使用乙個應用程式,而窗體卻在我第乙個顯示器的頂層,那麼當我切換回應用程式時,onpaint事件好像沒能被呼叫 。也就是說閃爍一直在進行 - 我注意到這應該是ms實時訊息的乙個問題。

幹得好,西蒙 - 非常好的技巧!

無邊窗體在工作列上的系統選單

我們可能會用到乙個沒有邊框的窗體,因為這樣我們可以在整個窗體上自由的繪製。然後我們也會發現乙個討厭的問題,這個時候在工作列上滑鼠右鍵點不出那可愛的系統選單了。這樣會不好,會使得使用者感覺到沒有道理,為什麼別的視窗都有系統選單,而只有我們的窗體沒有系統選單呢?其實如果我們使用vc建立mfc程式的時候,...

隱藏在工作列中的程式 VB

public declare function getwindowlong lib user32 alias getwindowlonga byval hwnd as long,byval nindex as long as long public declare function setwindo...

C WinForm程式不不在工作列顯示的處理方法

窗體不在工作列上顯示程式的窗體,c form提供了乙個 屬性值可以很好的解決這個問題 這個屬性就是 showintaskbar 在微軟的官方宣告格式為 public bool showintaskbar 及可以通過這個屬性來獲取或設定乙個值 這個屬性值的預設值是true 就是要在工作列上顯示窗體,如...