システム トレイ アプリの通知アイコンのクリックに基づいて、小さなウィンドウの表示を切り替えようとしています。これは実装するのに十分簡単ですが、小さなウィンドウが表示され、別のアプリケーションがフォーカスを取得してその前に移動すると (z オーダー)、小さなウィンドウが非表示になっていると仮定してトグルが必要です。まだ見えるように設定されています。そうしないと、アイコンをクリックすると、ウィンドウが別のウィンドウの背後に隠れていても、ウィンドウの表示が非表示に設定されます。activate メソッドと deactive メソッドをキャッチ/オーバーライドして追跡しようとしましたが、通知アイコンをクリックすると、常に deactive イベントが最初に発生します。フォーカス/失われたフォーカスを使用した同様のアプローチでは、アクティブに使用されている別のアプリケーション ウィンドウの背後に隠れていても、ウィンドウがまだフォーカスを持っていると考えているように見えるため、動作しません。結局、次のようにネイティブ コードと WindowFromPoint メソッドに頼らなければなりませんでした。
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Drawing;
[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(Point lpPoint);
public static bool IsWindowVisible(System.Windows.Window window) {
WindowInteropHelper win = new WindowInteropHelper(window);
int x = (int)(window.Left + (window.Width / 2));
int y = (int)(window.Top + (window.Height / 2));
Point p = new Point(x, y);
return (win.Handle == WindowFromPoint(p));
}
これは、問題のウィンドウの中心の座標で返されたウィンドウがそのウィンドウと一致するかどうかを確認します。つまり、問題のウィンドウの中心が表示されます。
これは少しハックに思えますが、同じ結果を達成するためのより良い方法はありますか?