2012-02-29 12 views
6

システムトレイにNotifyIconがあります。ユーザーが左クリックしたときにどうすれば検出できますか?私はMouseDownイベントを使用したいと思っていましたが、右クリックと中央ボタンのクリックだけを処理します。左クリックの場合、ユーザーが放した後にのみ発火します(通常のクリックをしたように)。 MouseDownイベントのみを取得する方法はありますか?NotifyIconに相当するMouseDownがありますか?

+1

私はいくつかのことも試しました。あなたは私が好奇心を持っています。私もそれを試してVS11をインストールしました。運がない。私はほとんどそのバグだと思う。私は誰かにも答えがあることを願っています。 – JimDel

+1

私はそれがドラッグできるという事実と関係していると思います(これは、アプリケーションではなくWindows自体によって処理されます)。たぶん、「mousedown」イベントは、アプリにバブリングするのではなく、Windowsに吸収されているのかもしれません。 – Skoder

+1

[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.mousedown.aspx)のこれは完全に間違っていますか? – Steve

答えて

4

これは仕様で、シェルはUpイベントからのMouseDownメッセージを合成します。ボタンをクリックしたままにしてドラッグを開始すると、このように動作する理由がわかります。通知領域のオーバーフローウィンドウがどのようにポップアップし、アイコンをドラッグして表示領域から削除するかを確認します。それは両方の方法で動作することはできません。

技術的には、Explorer.exeが所有するウィンドウをフックして、エクスプローラがSetWindowsHookEx()で行う前にメッセージに亀裂を入れることができます。ただし、C#で記述できない種類のDLLが必要な場合は、エクスプローラに注入する必要があります。非常に不安定で、同じことをしようとしている競争に勝つのは難しい。また、マイクロソフトのappcompatチームの不眠の夜を引き起こすコードの種類。

3

これは、基礎となるのWin32 API Shell_NotifyIconWM_LBUTTONDOWNメッセージを送ることが表示されますときユーザークリックアイコン。とにかくMSDNによると。

NotifyIconのWindowsフォームソースコードを調べると標準のマウスダウンイベント処理が行われるため、Win32メッセージが「正しい」時刻に送信されていれば、期待通りに動作します。

ユーザーがアイコンをドラッグできるようにマウスをキャプチャする必要があるため、NotifyIconがWM_LBUTTONDOWNを飲み込むという前のコメントに同意する必要があります。

this articleは、C#のSetWindowsHookExなどを使用する方法を示しているので、WPFのトレイアイコンを作成すると便利です。

+0

これは、設計通りに、mousedownイベントを処理する方法がないことを意味しますか? – Skoder

+0

私は簡単な方法はないと思います。タスクバーがそれらを処理する前に、WM_XXXメッセージを低レベル(C++で)フックすることは可能かもしれませんが、そのようなことをしてから長い時間です。 – Phil