C# 何时使窗体闪烁并停止闪烁?

C# 何时使窗体闪烁并停止闪烁?,c#,flash,window,C#,Flash,Window,我正在写一个即时通讯程序,我有方法使一个窗体闪烁并停止闪烁。。。问题是,我如何实现它 当消息到达时,我可以设置窗口闪烁,但我需要确保它没有焦点。检查聚焦方法似乎总是返回false,因此即使在窗体打开时也会闪烁 另外,我需要处理哪个事件来停止闪烁?当用户单击表单以使其最大化,或者将焦点切换到表单时,我需要一种方法来停止它 最好的方法是什么?检查表单是否最小化: if (this.WindowState == FormWindowState.Minimized) { MakeFormFlas

我正在写一个即时通讯程序,我有方法使一个窗体闪烁并停止闪烁。。。问题是,我如何实现它

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

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


最好的方法是什么?

检查表单是否最小化:

if (this.WindowState == FormWindowState.Minimized)
{
    MakeFormFlash();
}
else
{
    MakeFormStopFlash();
}
当用户或代码激活表单时要触发的事件:

this.Activated += new EventHandler(Form_Activated);

检查表单是否最小化:

if (this.WindowState == FormWindowState.Minimized)
{
    MakeFormFlash();
}
else
{
    MakeFormStopFlash();
}
当用户或代码激活表单时要触发的事件:

this.Activated += new EventHandler(Form_Activated);

您可以处理窗体的激活和停用事件,并使用它们更改窗体级别的布尔值,该布尔值将告诉您的代码窗体是否具有焦点,如下所示:

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;
}
当消息到达时,您可以检查
\u IsActivated
,以确定您的表单是否已经是活动窗口,如果不是,则打开闪烁。在激活的事件中,如果闪烁处于打开状态,您将关闭闪烁


如果表单上有任何控件,则表单的
Focused
属性将始终返回
false
。此属性指的是相关控件(本例中为窗体)是否在应用程序窗体中具有焦点,而不是应用程序本身是否在Windows中具有焦点。

您可以处理窗体的激活和停用事件,并使用它们更改窗体级别的布尔值,该布尔值将告诉您的代码您的窗体是否具有焦点,如下所示:

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;
}
当消息到达时,您可以检查
\u IsActivated
,以确定您的表单是否已经是活动窗口,如果不是,则打开闪烁。在激活的事件中,如果闪烁处于打开状态,您将关闭闪烁


如果表单上有任何控件,则表单的
Focused
属性将始终返回
false
。此属性指的是所讨论的控件(本例中为窗体)是否在应用程序窗体中具有焦点,而不是应用程序本身是否在Windows中具有焦点。

要检查的属性应该是聚焦良好的属性,因此您需要试着找出为什么总是返回false


至于要侦听的事件,可能是GotFocus事件,但在您找出Focused属性的错误之前,这可能不起作用。

要检查的属性应该是聚焦良好,因此您需要尝试找出为什么它总是返回false


至于要侦听的事件,可能是GotFocus事件,但在您找出Focused属性的错误之前,这可能不起作用。

有多种方法可以处理此问题。可能最简单的方法是在表单闪烁时设置一个标志,以便在重新激活表单时重置该标志,例如:

基本IM窗口窗体的代码

然后,无论您在何处执行代码来处理新消息,您只需检查消息指向的特定对话窗口(如果您处理多个对话窗口)是否为当前活动窗口:

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

有很多方法可以解决这个问题。可能最简单的方法是在表单闪烁时设置一个标志,以便在重新激活表单时重置该标志,例如:

基本IM窗口窗体的代码

然后,无论您在何处执行代码来处理新消息,您只需检查消息指向的特定对话窗口(如果您处理多个对话窗口)是否为当前活动窗口:

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

这根本不能缓解OP提到的表单聚焦问题,不是吗?如果我误解了OP的问题,你能解释一下吗?据我所知,(a)激活窗口时需要停止闪烁(这可能已经由窗口管理器完成)和(b)未聚焦时应该闪烁,而不仅仅是最小化。这根本不能缓解OP提到的表单聚焦问题。不是吗?如果我误解了OP的问题,你能解释一下吗?据我所知,(a)激活窗口时需要停止闪烁(这可能已经由窗口管理器完成)和(b)在未聚焦时,而不是仅在最小化时闪烁。你没有使用焦点()方法而不是Focused属性来检查焦点,是吗?不是使用focus()方法而不是Focused属性来检查焦点,是吗?不需要为activate创建私有变量。Form.ActiveForm将为您提供应用程序的当前活动窗体。@詹姆斯:在这种情况下,我仍将使用私有变量。否则,您必须执行类似“if(Form.ActiveForm==this){}”的操作来确定应用程序是否具有Windows焦点。或者你可以创建一个名为IsActivated的表单的公共只读属性,结果就是你提到的代码:)不需要为activate创建私有变量。Form.ActiveForm将为您提供应用程序的当前活动窗体。@詹姆斯:在这种情况下,我仍将使用私有变量。否则,您必须执行类似“if(Form.ActiveForm==this){}”的操作来确定应用程序是否具有Windows焦点。或者你可以创建一个名为IsActivated的表单的公共只读属性,结果就是你提到的代码:)