2

我的 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

后台工作人员的 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 论坛上发布了这个,到目前为止也没有运气。

4

1 回答 1

0

我记得几年前在一个应用程序中看到了类似的东西,它实例化了一个新的NotifyIcon而不处理以前的实例。

于 2011-01-18T19:41:54.250 回答