Как лучше всего определить, действительно ли окно видно в WPF? - PullRequest
9 голосов
/ 18 января 2009

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

Это проверяет, соответствует ли окно, возвращенное в координатах центра рассматриваемого окна, указанному окну. то есть центр рассматриваемого окна виден.

Это кажется немного странным, есть ли лучший способ достичь того же результата?

1 Ответ

2 голосов
/ 18 января 2009

Возможно, вы не захотите полагаться на то, закрыто ли окно, поскольку существует множество факторов, которые могут изменить размер окна, положение и т. Д., И все они связаны с функциями доступности, которые добавляют еще больше сложностей.

Вместо этого вы можете проверить, имеет ли окно фокус. Вот как MSN Messenger узнает, мигать ли оранжевым цветом на панели задач; он запускает уведомление, и если у него нет фокуса, панель задач мигает.

...