Я пытаюсь переключить отображение небольшого окна, основываясь на щелчке значка уведомления в приложении на панели задач. Это достаточно просто реализовать, однако, когда небольшое окно отображается, а другое приложение фокусируется и, следовательно, перемещается перед ним (z-порядок), я хочу, чтобы переключатель предполагал, что небольшое окно теперь скрыто, даже если его видимость все еще установлено на видимое. В противном случае, щелкнув значок, можно будет скрыть видимость окна, даже если оно уже скрыто за другим. Я пытался перехватить / переопределить методы активации и деактивации, чтобы отслеживать, но нажатие на значок уведомления всегда вызовет сначала деактивное событие. Аналогичный подход с использованием фокуса / потерянного фокуса также не сработал, поскольку окно, похоже, считало, что оно все еще имеет фокус, даже когда скрыто за другим окном приложений при активном использовании. В конце концов мне пришлось прибегнуть к нативному коду и методу 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));
}
Это проверяет, соответствует ли окно, возвращенное в координатах центра рассматриваемого окна, указанному окну. то есть центр рассматриваемого окна виден.
Это кажется немного странным, есть ли лучший способ достичь того же результата?