切换NotifyIcon上的表单可见性单击并在其他位置单击时隐藏它

ble*_*jzz 1 c# windows notifyicon winforms

我有一个在系统托盘中的应用程序.我想让用户点击它时可见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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码的问题是onDeactivated在点击调用之前调用,它隐藏表单而notifyIcon1_MouseClicked不是重新显示它.如果我能够检测到焦点是否由于点击notifyIcon或其他原因而丢失,则可以解决问题.

我已经完成了我的研究并发现了一个类似的线程,但是当onDeactivated被调用时,只有当鼠标位置在托盘上时才检测到解决方案:通过单击NotifyIcon(任务栏图标)来切换C#窗口

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

Han*_*ant 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();
}
Run Code Online (Sandbox Code Playgroud)

现在可以反复单击该图标以切换窗口可见性.