我有一个vb.net(.NET 3.0)应用程序,它在系统托盘中有一个NotifyIcon。我希望单击左键单击和双左键单击事件来执行不同的操作; .Click
应该打开应用的上下文菜单,.DoubleClick
应该采取一些默认操作。所以这是我目前的代码:
Private Sub showMenu(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles Tray.Click
Debug.Print("click")
If e.Button = MouseButtons.Left Then
Dim mi As MethodInfo = GetType(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance Or BindingFlags.NonPublic)
mi.Invoke(Tray, Nothing)
End If
End Sub
Private Sub defaultAction(ByVal sender As System.Windows.Forms.NotifyIcon, ByVal e As System.EventArgs) _
Handles Tray.DoubleClick
Debug.Print("double click")
doDefaultAction()
End Sub
第一个问题是.Click
处理程序即使双击也会被触发 - 它响应第一次点击而不是等待它是否实际上是双击。也许这是正常的行为,但是有一个最好的做法'如果没有涉及计时器的可怕的克服,这种情况会被捕获?从我在SO上读到的内容,我怀疑不是。但是,这不是最严重的问题......
第二个更大的问题是doDefaultAction()
代码执行各种操作,其中一个是从特定URL下载xml文件。我使用这行代码执行此操作(请注意不是实际的URL :):
Dim reader = XmlReader.Create("http://server.com/genxml.php")
一旦执行到达该行,就会触发另一个 .Click
事件,因此调试输出如下所示:
click
double click
click
第二次点击事件会重新打开上下文菜单,并且因为doDefaultAction()
继续显示模式MessageBox
,菜单会被卡住。我已经介入了调试器,如果我已经进入调试阶段。那Dim reader
行,我直接进入Sub showMenu()
以上。很奇怪。什么可能导致这种想法?