1

我有一个在系统托盘中的应用程序。我想让它在用户点击时可见notifyIcon,如果它已经不可见的话。如果它已经可见,则应将其隐藏。此外,当用户单击表单以外的任何其他位置时,表单应该隐藏(如果它是可见的)。

我的代码如下所示:

protected override void OnDeactivated(EventArgs e)
{
    showForm(false);
}

public void showForm(bool show)
{
    if(show)
    {
        Show();
        Activate();
        WindowState = FormWindowState.Normal;
    }
    else
    {
        Hide();
        WindowState = FormWindowState.Minimized;
    }
}

private void notifyIcon1_MouseClicked(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        if (WindowState != FormWindowState.Normal)
        {
            showForm(true);
        }
    }
}

代码的问题是onDeactivated在点击调用之前被调用,它隐藏了表单,notifyIcon1_MouseClicked而不仅仅是重新显示它。如果我可以检测到焦点是否由于单击notifyIcon或其他地方而丢失,它将解决问题。

我已经完成了我的研究并找到了一个类似的线程,但解决方案只是检测到鼠标位置是否在onDeactivated被调用时位于托盘上方:C# toggle window by click NotifyIcon (taskbar icon)

更新:我发布的解决方案仅检测用户的鼠标是否位于任务栏中的托盘图标上,因此如果您单击任何其他托盘,onDeactivated则不会触发该事件。我想获得与系统音量应用程序相同的功能。

4

1 回答 1

5

只需跟踪窗口上次隐藏的时间。如果最近发生这种情况,请忽略鼠标单击。像这样:

int lastDeactivateTick;
bool lastDeactivateValid;

protected override void OnDeactivate(EventArgs e) {
    base.OnDeactivate(e);
    lastDeactivateTick = Environment.TickCount;
    lastDeactivateValid = true;
    this.Hide();
}

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
    if (lastDeactivateValid && Environment.TickCount - lastDeactivateTick < 1000) return;
    this.Show();
    this.Activate();
}

现在反复单击图标可以可靠地切换窗口可见性。

于 2011-09-05T15:08:14.650 回答