在单击NotifyIcon时切换表单可见性,并在单击其他地方隐藏它
本文关键字:单击 方隐藏 隐藏 其他 NotifyIcon 可见性 表单 | 更新日期: 2023-09-27 18:07:53
我有一个在系统托盘中的应用程序。我想让它在用户点击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#切换窗口点击通知图标(任务栏图标)
更新:我发布的解决方案只检测用户的鼠标是否在任务栏的托盘图标上,所以如果你点击任何其他托盘,onDeactivated
事件不会被触发。我想获得与系统卷应用程序相同的功能。
只需跟踪窗口上次隐藏的时间。如果最近发生过,忽略鼠标点击。这样的:
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();
}
重复点击图标现在可以可靠地切换窗口可见性