我有一个应用程序在系统托盘中。我想让它在用户点击 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 clicking NotifyIcon (taskbar icon)
更新:
我发布的解决方案仅检测用户的鼠标是否位于任务栏中的托盘图标上,因此如果您单击任何其他托盘,则不会触发 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();
}
现在重复单击该图标可以可靠地切换窗口可见性。
关于c# - 单击 NotifyIcon 切换表单可见性并在其他地方单击时隐藏它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7309098/