我正在写一个IM程序,我有制作表单闪存并停止闪烁的方法......问题是,我该如何实现它?
当消息到达时,我可以设置窗口闪烁,但我需要确保它没有焦点。检查聚焦方法似乎总是返回false,因此即使表单打开也会闪烁。
另外,我需要处理哪个事件来阻止它闪烁?当用户单击表单以使其最大化或将焦点切换到表单时,我需要一种方法来停止它。
最好的方法是什么?
答案 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();
}
}