0

これは説明するのが難しい質問で、約 1 時間検索しましたが、役に立ちませんでした。

基本的に、Windows 7 のワイヤレス コントロールやシステム トレイ (通知領域) のボリューム スライダーのような小さな「フライアウト」ウィンドウを思い浮かべてください。アイコンをクリックすると、フォーカスのあるアプリケーションがポップアップ表示されます。アイコンをクリックしないと、ウィンドウは自動的に破棄されます。

ウィンドウがフォーカスを失ったときにウィンドウを破壊するだけで簡単に解決できると思いました(WM_KILLFOCUSを聞いていました)が、問題は、アイコンがクリックされた場合、ウィンドウが常にフォーカスされるとは限らないことです。これは当てはまらないので、ユーザーが私のアイコンをクリックしてから、それが間違いだったためにクリックして離れた場合 (デスクトップ上で言う)、どうすればアプリを閉じるように設定できますか?

SPY++ をいじってみましたが、ウィンドウ/プロセス ハンドルを取得しようとすると、ボリューム コントロール/ワイヤレス コントロール アプリが消えてしまうため、確認するのが難しいことがわかりました。

ありがとう!

4

3 に答える 3

2

これを実装する通常の方法は、ウィンドウ作成時にタイマーを開始することです。タイマーがトリガーされる前にウィンドウがフォーカスを取得した場合、これはユーザーがウィンドウを操作したことを意味します。この場合、ウィンドウはタイマーを停止し、フォーカスを失うと自動的に破壊されます。タイマーがトリガーされる前にウィンドウがフォーカスを取得しなかった場合、ウィンドウはタイマーイベントでそれ自体を破壊します。

これは通常、不透明度アニメーションと組み合わされているため、ユーザーを待っている間、ウィンドウはフェードアウトします。間もなくなくなるというユーザーへの視覚的なフィードバックのようなものです。ただし、不透明度アニメーションは主に通知トーストに使用され、ボリュームコントロールなどのコントロールウィンドウに使用されることはめったにありません。

別の方法は、ユーザーがシステムトレイアイコンを操作したときにウィンドウにフォーカスを強制的に設定することです。

また、ウィンドウがトップレベルウィンドウの場合、リッスンする優先メッセージは、ではなくWM_KILLFOCUS、でWM_ACTIVATEあることに注意してくださいWM_MOUSEACTIVATE。を聞くこともできWM_NCACTIVATEますが、カスタムの非クライアント領域を実行している場合は、いくつかの詳細があります。

更新:ウィンドウを作成するとき(または非表示にしている場合は表示するとき)に、SetActiveWindowまたはウィンドウを呼び出すことで、ウィンドウにフォーカスを設定できます。SetFocus

于 2010-06-14T20:19:37.073 に答える
1

ずっと前に、Windows 3.1 のタスク マネージャーのドロップイン代替品を書きましたWM_ACTIVATEAPP。試してみてください。

于 2010-06-14T20:30:54.847 に答える
0

ポップアップを調べましたか?その外側をクリックすると、その1つは消えます(StaysOpenをtrueに設定しない限り)。

于 2010-06-14T20:17:12.257 に答える