WinForms: Как определить, что окно больше не активно (ни одно дочернее окно не имеет фокуса)? - PullRequest
2 голосов
/ 25 марта 2010

Мое приложение использует несколько окон

Я хочу скрыть одно конкретное окно в случае, когда приложение теряет фокус (когда активное окно не является окном приложения) source

Я обрабатываю Deactivate событие моей основной формы.

    private void MainForm_Deactivate(object sender, EventArgs e) 
    {
      Console.WriteLine("deactivate");
      if (GetActiveWindow() == this.Handle) 
      {
        Console.WriteLine("isactive=true");
      }
      else
      {
        Console.WriteLine("isactive=false");
      }
    }

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();

Выход всегда

deactivate
isactive=true

Я наблюдал такое же поведение, если новое окно в моем приложении получает фокус, а также если я щелкаю в другом приложении.

Я ожидаю, что GetActiveWindow вернет дескриптор нового активного окна при вызове из обработчика Deactivate. Вместо этого он всегда возвращает дескриптор окна моего приложения.

Как это возможно? Событие «Деактивировать» обрабатывается «слишком рано»? (пока основная форма еще активна?).

Как я могу определить, что мое приложение потеряло фокус (окно моего приложения не является активным окном), а другое приложение получило его без запуска GetActiveWindow по таймеру?

Ответы [ 2 ]

3 голосов
/ 25 марта 2010

Из того, что я вижу, GetActiveWindow get - это активное окно для вызывающего потока, то есть вашего приложения, поэтому оно всегда будет возвращать текущее окно вашего приложения.Я думаю, что, возможно, вы ищете GetForegroundWindow, которое вернет дескриптор окна, в котором в данный момент активен пользователь.

0 голосов
/ 25 марта 2010

Я наблюдаю то же поведение (.NET 3.5, Visual Studio 2008).Документация туманна:

Происходит, когда форма теряет фокус и перестает быть активной формой.

Однако контраст между именами событий (Активировать d против Деактивировать) предполагает, что событие действительно предшествует фактической деактивации.

...