2011-01-03 16 views
3

WPFでWindows 7/Vistaスタイルの通知領域(システムトレイ)ポップアップアプリケーションを実装しています。私はこれまでのところ、here(通知アイコンの位置の決定、サイズ変更の無効化など)について書いてきました。通知アイコンをクリックしたときの表示/非表示ウィンドウの切り替え

通知アイコンが2回クリックされたときにウィンドウを非表示にすることは、私が満足して解決していない1つの問題があります。 Vista/7のボリュームアイコン(たとえば)をクリックして音量コントロールを表示すると、アイコンがもう一度クリックされると再び非表示になります。

ウィンドウの非アクティブ化イベントを処理して、ウィンドウを非表示にします。通知アイコンをクリックすると、ウィンドウは実際には非アクティブになります。しかし、コースの通知アイコンをクリックするとウィンドウがアクティブになりますので、マウスが押されている間はウィンドウが消え、マウスが離されるとウィンドウが再表示されます(マウスクリックイベントの完了)。

私が最初に考えたのは、通知アイコンのMouseDownイベント(私はSystem.Windows.Forms.NotifyIconを使用しています)を使用し、その時間にウィンドウが表示されているかどうかを確認することでした。ユーザーが通知アイコンをクリックして2回目にウィンドウを隠すようにします。残念ながら、MouseDownイベントは、マウスが実際にクリックされるまで(つまり、MouseClickイベントと同じように動作するまで)起動されないように見えます。この時間が経過すると、ウィンドウは既に無効化されているため、非表示になります。これはこの解決法を排除しているようです。

私の次のアイデアは、ウィンドウが非アクティブになったとき(GetCursorPos)にカーソル位置を取得し、そのポイントが通知アイコンの境界内にあるかどうかを確認することでした。同時に、GetForegroundWindowを使用して、現在アクティブなウィンドウを探します。通知アイコンが実際にクリックされる場合は、タスクバー(クラス名Shell_TrayWndを持つ最上位ウィンドウ)または通知領域のフライアウト(クラス名がNotifyIconOverflowWindowのトップレベルウィンドウ、Windows 7以降のみ)。要するに、カーソルが通知アイコンの上にあり、通知領域がアクティブである場合、ユーザーが通知アイコンをマウスでクリックしてウィンドウを非表示にすると仮定します。これらの条件が満たされている場合、次のMouseClickイベントはウィンドウの表示/アクティブ化を引き起こしません。

この解決方法には、カーソルが通知アイコンの上にあり、ユーザーがWindowsキーを押してスタートメニューを開く(またはWindowsキー+番号ショートカットを使用してアプリケーションを開く)場合、少なくとも1つの問題があります。私のプログラムは、タスクバーがそれらのキーボードショートカットによってアクティブにされているので、誤ってそれを通知アイコンへのマウスダウンとして解釈します。つまり、次回ユーザーが実際に通知アイコンをクリックすると、ウィンドウは表示されません。 (もう一度通知アイコンをクリックすると表示されます)

私が書いたことが意味をなさないことを願っています。そうでない場合は、私は状況をさらに明確にしようとしてうれしいです。

誰かがこれを解決する方法について他のアイデアを持っているかどうか聞いてみたいと思います。

私はそれが可能ではない可能性があります:ネイティブのWindows 7通知領域のポップアップアプリケーション自体が単純なタイマー実装を使用しているようです。音量コントロールが開いているときに(たとえば)ボリュームアイコンをクリックすると、ウィンドウの非アクティブ化とマウスクリックの間の時間が約2秒未満の場合にのみ音量コントロールが閉じます。マウスを長時間アイコンの上に置いたまま放すと、マウスが押される前に開いていたとしても、ボリュームコントロールが再び表示されます。

答えて

1

これは音量調整ウィンドウの仕組みではありません。通知アイコンを含めて、のいずれかをクリックすると消えます。アイコンは関係ありません。これは標準のWin32トリックです。ウィンドウの外にクリックが表示されるようにマウスをキャプチャします。

マウス。WPFでのキャプチャ。ウインドウハンドルの代わりにIInputElementが必要なので、それほど簡単ではありません。

+0

あなたが正しいです、通知アイコンはウィンドウを隠すこととは関係ありません - ウィンドウが非アクティブになるとウィンドウが非表示になります(WA_INACTIVEをwParamとしてWM_ACTIVATEメッセージを受け取ったとき、私は推測します)。問題は、アイコンをクリックすると、音量コントロールウィンドウ/が表示されていることを示します。 – Quppa

+0

いいえ、マウスのキャプチャが重要です。これは、クリックがウィンドウを閉じること以外の副作用を起こさないようにします。あなたが戦っているのはどちらですか? –

+0

どのような副作用ですか? (私はあまりWin32について知識がありません、ごめんなさい)。これは、キーボードボタンの押下もキャプチャする必要があることを意味しますか?たとえば、Altキーを押したままタブをクリックすると、ウィンドウが非表示になります。 – Quppa

関連する問題