2009-07-27 9 views
0

正常に機能する通知アイコンを右クリックしてポップアップメニューを表示しようとしています。しかし、ユーザーがそのメニューの外をクリックするとメニューが消えてしまいます。Delphiの「トレイ」アイコン(NotifyIcon)コンテキストメニューは、外部をクリックすると消えません。

これはおそらく(このドキュメント:http://support.microsoft.com/kb/135788)によると思われますが、私が知っているまともなアプリケーションはこのように動作しません。私はポップアップメニューのハンドルを使用して無駄にSetForegroundWindowを呼び出すことを試みました。何年も前にやったことがあるが、どうやって覚えていないのか、これを回避することは可能だろう。

誰でも予期した動作を達成する方法を知っていますか?

答えて

0

私は解決策を見つけました。

私は を呼び出していました。SetForegroundWindow(PopupMenu1.Handle);

動作しません

が、

procedure TForm1.PopupMenu1Popup(Sender: TObject); 
begin 
    // Hack to fix the "by design" behaviour of popups from notification area icons. 
    // See: http://support.microsoft.com/kb/135788 
    BringToFront(); 
end; 

作品にOnPopupイベントハンドラでこれを変えます!

明らかに、これが呼び出されたときにフォームが表示されていれば、アプリは一番上に飛びますが、非表示の場合(私の場合)は動作します。

私は、メニューがうまく機能しないようにする方法があるかどうか知りたいと思います。

+1

あなたの 'SetForegroundWindow'呼び出しがうまくいかなかったのは、あなたが* window *ハンドルの代わりに* menu *ハンドルを与えていたからです。彼らは交換できません。代わりに、 'Handle'(a.k.a.' Self.Handle')だけを使ってください。 –

+0

合意。すべての私のシステムトレイアプリケーションでは、SetForegroundWindow()を使用して、ポップアップメニューを表示する前にTFormをフォーカスします。また、ポップアップメニューが閉じた後も、TFormにWM_NULLメッセージを発行します。 –

+0

SetForegroundWindowのステータスを確認せずに、自動的に失敗する可能性がありますか? – OnTheFly

関連する問題