何时使表格闪烁并停止闪烁?

时间:2009-09-21 13:23:39

标签: c# flash window

我正在写一个IM程序,我有制作表单闪存并停止闪烁的方法......问题是,我该如何实现它?

当消息到达时,我可以设置窗口闪烁,但我需要确保它没有焦点。检查聚焦方法似乎总是返回false,因此即使表单打开也会闪烁。

另外,我需要处理哪个事件来阻止它闪烁?当用户单击表单以使其最大化或将焦点切换到表单时,我需要一种方法来停止它。

最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

您可以处理表单的Activated和Deactivate事件,并使用它们来更改表单级布尔值,该布尔值将告诉您的代码表单是否具有焦点,如下所示:

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属性将始终返回{{1}}。此属性指的是相关控件(在本例中为表单)是否在应用程序的表单中具有焦点 ,而不是应用程序本身是否在Windows中具有焦点。

答案 1 :(得分:0)

检查表单是否最小化:

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

用户或代码激活表单时触发的事件:

this.Activated += new EventHandler(Form_Activated);

答案 2 :(得分:0)

Well Focused应该是要检查的属性,所以你需要尝试找出为什么总是返回false。

至于要收听的事件,可能是GotFocus事件,虽然这可能无法解决,直到你能解决Focused属性的错误。

答案 3 :(得分: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();
    }
}