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
他の誰かがこれを引き起こしている可能性があるもの、またはおそらくこれをさらにデバッグする方法についてのアイデアを持っていますか?私はパターンを見ずにこれに頭をぶつけてきたので、別の目が非常にありがたいです。:)私はこれをMSDNwinformsフォーラムにも投稿しましたが、これまでのところ運がありませんでした。