我的 C# 应用程序由一个任务栏图标 (NotifyIcon) 和一个最初隐藏的顶部窗口组成。我希望用户能够通过单击 NotifyIcon(左,单击)来切换窗口可见性。失去焦点时,窗口也会被隐藏。
这是我到目前为止所拥有的,一个子类System.Windows.Forms.Form
:
初始化:
this.ControlBox = false;
this.ShowIcon = false;
this.ShowInTaskbar = false;
// Instance variables: bool allowVisible;
// System.Windows.Forms.NotifyIcon notifyIcon;
this.allowVisible = false;
this.notifyIcon = new NotifyIcon();
this.notifyIcon.MouseUp += new MouseEventHandler(NotifyIconClicked);
this.Deactivate += new EventHandler(HideOnEvent);
实例方法:
private void NotifyIconClicked(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (this.Visible)
this.Hide();
else
this.Show();
}
}
new public void Show()
{
this.allowVisible = true;
this.Visible = true;
this.Activate();
}
new public void Hide()
{
this.allowVisible = false;
this.Visible = false;
}
private void HideOnEvent(object sender, EventArgs e)
{
this.Hide();
}
protected override void SetVisibleCore(bool visible)
{
base.SetVisibleCore(this.allowVisible ? visible : this.allowVisible);
}
单击该图标会显示应有的窗口。但是,只要按下鼠标,再次单击它就会隐藏它,然后将其重置为可见。
我的猜测是鼠标按下事件会从窗口中窃取焦点,因此它会消失。然后触发鼠标向上事件,显示隐藏的窗口。
我的下一个想法是在鼠标按下事件时读取窗口可见性,因此我测试了三个事件并在它们被调用时记录了 UNIX 时间:
notifyIcon.MouseDown
notifyIcon.MouseUp
this.LostFocus
结果很奇怪:假设窗口是可见的。当我单击图标时会发生这种情况:立即调用焦点丢失。只要我释放鼠标,就在鼠标向上事件之前调用鼠标向下。
1312372231 focus lost
1312372235 mouse down
1312372235 mouse up
为什么鼠标按下事件延迟?
如何切换窗口?