1

NotifyIconを左クリックすると、コンテキストメニューを表示しようとしています。NotifyIcon.ContextMenuStrip.Show()を呼び出すだけでは、うまく機能しません。Reflectionを使用してシークレットメソッドを呼び出す前に、ソリューションがここに投稿されています。

Dim mi As System.Reflection.MethodInfo = GetType(NotifyIcon).GetMethod("ShowContextMenu", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
mi.Invoke(Icon, Nothing)

これは、メニューが表示される場所を制御する必要があることを除いて、うまく機能します。NotifyIcon.MouseUpイベントを受信して​​からメニューを表示するまでにSystemInformation.DoubleClickTimeが経過するのを待ち、シングルクリックとダブルクリックを別々に処理できるようにします。ただし、ShowContextMenuメソッドを呼び出すと、アイコンが実際にクリックされたときではなく、ShowContextMenuが呼び出されたときに現在のマウス位置にメニューが表示されます。つまり、DoubleClickTime中にマウスを動かすと、メニューは画面の別の部分に表示されます。したがって、メニューの表示場所を制御できる場合は、MouseUpイベントを受信したときにマウスの座標を保存するだけで、メニューがアイコンの近くに表示されるようにすることができます。これを行う方法はありますか?

前もって感謝します。

4

1 に答える 1

0

さて、私はちょうどこれと同じ振る舞いを示す既存のプログラムがあることを発見しました。システムトレイのすべてのアイコンを確認したところ、約半分がそれを実行しています。アイコンを左クリックして、メニューが表示されるまでの遅延中にマウスを動かすと、メニューは画面上の最後のマウス位置に表示されます。Snagitは、これを行う1つのアプリケーションです。Outlookは、アイコンをクリックしたメニューを常に表示するトレイ内の唯一のプログラムです。ただし、Snagitは.NET ContextMenuStripを使用しているように見えますが、Outlookはおそらくネイティブメニューを使用しています。

したがって、これは標準的な動作であるか、他の誰も解決できていないという問題です。そして、ユーザーとして、私は昨日自分のアプリケーションをテストしていたときまで、この動作に気づいたことはありませんでした。ですから、それほど大したことではないと思いますし、心配する必要はありません。

于 2010-03-19T18:18:04.320 に答える