系统托盘中显示额外的NotifyIcon

时间:2011-01-07 16:45:50

标签: vb.net winforms notifyicon

我的应用程序存在问题,我的NotifyIcon会显示一个额外的图标。重现它的步骤很简单,但问题是在我们添加了火灾的任何实际代码隐藏之后会显示额外的图标。简而言之,单击一个按钮会触发方法FooBar()的执行,该方法一直运行良好,但其主要职责是触发后台工作人员登录我们的另一个应用程序。仅在单击此特定按钮时才会显示。

奇怪的是,我们有一个WndProc方法覆盖,如果我单步执行直到出现额外的NotifyIcon,它总是出现在这个方法中,所以除了代码隐藏之外的其他东西必须触发行为。我们的WndProc方法目前(虽然我不认为它是由WndProc引起的):

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

    'Check for WM_COPYDATA message from other app or drag/drop action and handle message
    If m.Msg = NativeMethods.WM_COPYDATA Then
      ' get the standard message structure from lparam
      Dim CD As NativeMethods.COPYDATASTRUCT = m.GetLParam(GetType(NativeMethods.COPYDATASTRUCT))

      'setup byte array
      Dim B(CD.cbData) As Byte

      'copy data from memory into array
      Runtime.InteropServices.Marshal.Copy(New IntPtr(CD.lpData), B, 0, CD.cbData)

      'Get message as string and process
      ProcessWMCopyData(System.Text.Encoding.Default.GetString(B))

      'empty array
      Erase B

      'set message result to 'true', meaning message handled
      m.Result = New IntPtr(1)
    End If

    'pass on result and all messages not handled by this app
    MyBase.WndProc(m)
  End Sub

代码中唯一可以处理NotifyIcon的地方是以下事件处理程序(再次,不要认为这是罪魁祸首,只是为了获取更多信息):

Private Sub TrayIcon_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TrayIcon.MouseDoubleClick
    If Me.Visible Then
      Me.Hide()
    Else
      PositionBottomRight()
      Me.Show()
    End If
  End Sub

backgroundworker的DoWork如下(只是一个类登记到我们的其他应用程序,但仅仅是为了信息):

Private Sub LoginBackgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles LoginBackgroundWorker.DoWork
    Settings.IsLoggedIn = _wdService.LogOn(Settings.UserName, Settings.Password)
End Sub

是否有其他人对可能导致此问题的原因或如何进一步调试此问题有所了解?我一直在敲打着我的头,没有看到一个模式,所以另一组眼睛会非常感激。 :)我已经在MSDN winforms论坛上发布了这个,到目前为止也没有运气。

1 个答案:

答案 0 :(得分:0)

我记得在几年前在一个应用程序中看到了类似于实例化新NotifyIcon而没有处理前一个实例的内容。