2009-09-21 156 views
1

我正在寫一個即時通訊程序,並且我有方法使表單閃爍並停止閃爍......問題是,我該如何實現它?何時使表單閃爍並停止閃爍?

當消息到達時,我可以設置窗口閃爍,但我需要確保它沒有焦點。檢查聚焦方法似乎總是返回false,因此即使窗體打開時也會閃爍。

此外,我需要處理哪個事件來阻止它閃爍?當用戶單擊表單使其最大化或將焦點切換到表單時,我需要一種停止方式。

最好的方法是什麼?

+0

您沒有使用Focus()方法而不是Focused屬性來檢查焦點嗎? – ICR 2009-09-21 13:44:46

回答

1

可以辦理激活和停用事件您形式,並使用它們來更改表單級布爾值,它會告訴您的代碼您的表單是否有焦點,如下所示:

private bool _IsActivated = false; 
private void Form1_Activated(object sender, EventArgs e) 
{ 
    _IsActivated = true; 
    // turn off flashing, if necessary 
} 
private void Form1_Deactivate(object sender, EventArgs e) 
{ 
    _IsActivated = false; 
} 

當消息到達時,您檢查_IsActivated以確定您的窗體是否已經是活動窗口,如果不是,則打開閃爍。在激活的事件中,如果它處於打開狀態,則可以關閉閃爍。

如果窗體上有任何控件,則表單的Focused屬性將始終返回false。此屬性是指有問題的控件(本例中爲表單)在應用程序的表單中的焦點,而不是應用程序本身是否具有Windows中的焦點。

+0

Theres不需要爲激活創建私有變量。 Form.ActiveForm將爲您提供應用程序的當前活動表單。 – James 2009-09-21 14:02:26

+0

@James:在這種情況下,我仍然會使用一個私有變量。否則,你必須做一些事情,如「if(Form.ActiveForm == this){}」來確定你的應用程序是否具有Windows焦點。它是一半的一半,另一半是六打的。 – MusiGenesis 2009-09-21 14:10:24

+0

或者你可以創建一個名爲IsActivated的公共只讀屬性,結果就是你提到的代碼:) – James 2009-09-21 14:16:01

0

檢查,如果窗體最小化或不:當形式由用戶或代碼激活

if (this.WindowState == FormWindowState.Minimized) 
{ 
    MakeFormFlash(); 
} 
else 
{ 
    MakeFormStopFlash(); 
} 

事件觸發:

this.Activated += new EventHandler(Form_Activated); 
+0

這並不能減輕OP提到的表單聚焦所帶來的問題。 – Joey 2009-09-21 13:35:48

+0

不是嗎?如果我誤解了OP,你能解釋OP的問題嗎? – Phoexo 2009-09-21 13:40:39

+0

據我瞭解,(a)在激活窗口時需要停止閃爍(這可能已經由窗口管理器完成),(b)閃爍時需要在未聚焦時閃爍,而不是僅在最小化時閃爍。 – Joey 2009-09-21 13:52:21

0

那麼重點應該是要檢查的屬性,所以你需要嘗試解決爲什麼總是返回false。

至於要聽什麼事件,可能是GotFocus事件,儘管這可能不起作用,直到您可以計算出Focused屬性出了什麼問題。

0

有很多方法可以處理這個問題。可能最簡單的方法是在窗體閃爍時設置一個標誌,以便在重新激活窗體時重置該標誌。

爲基礎的IM窗口形式的代碼

private bool IsFlashing; 
.... 

// Code for IM windows 
public void OnActivate(EventArgs e) 
{ 
    if (IsFlashing) 
    { 
     // stop flash 
     IsFlashing = false; 
    } 
} 

public void Flash() 
{ 
    // make flash 
    IsFlashing = true; 
} 

那麼無論你做你的代碼來處理你只需要檢查的特定會話窗口(如果你處理多個的),該新的消息消息指向的是當前活動的:

public void OnNewMessage(AMessage msg) 
{ 
    Form convoWindow = FindConvoWindow(msg.Sender); 
    if (Form.ActiveForm == convoWindow) 
    { 
     // update the conversation text 
    } 
    else 
    { 
     convoWindow.Flash(); 
    } 
}