vb.net如何通过单击和双击通知图标来解决2个问题

时间:2014-05-09 17:03:02

标签: vb.net events system-tray

我有一个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()以上。很奇怪。什么可能导致这种想法?

0 个答案:

没有答案