Приложение получило / потерял фокус - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть приложение, которое открывает некоторые дочерние окна с параметром Show () - Метод.Таким образом, у дочерних окон нет владельца, что позволило им находиться позади или перед главным окном.

Теперь я хотел бы знать, получает ли целое приложение фокус или теряет его.Есть ли одно событие для этого?

Я пробовал OnActivate / OnDeactivate и OnGotFocus / OnLostFocus, который сообщает о событиях только для одной формы.Это означает, что событие OnLostFocus вызывается, когда приложение теряет фокус, но также и в том случае, если фокусируется на другой форме.

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете указать WM_ACTIVATEAPP в основной форме и получать уведомления об активации или деактивации вашего приложения:

private const int WM_ACTIVATEAPP = 0x1C;
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_ACTIVATEAPP)
    {
        if (m.WParam == IntPtr.Zero)
            BeginInvoke(new Action(() => { Text = "Deactivated"; }));
        else
            BeginInvoke(new Action(() => { Text = "Activated"; }));
    }
    base.WndProc(ref m);
}

Примечание: Поскольку оно ужеУпомянутый в комментариях Ганса, при использовании вышеупомянутой опции вы должны быть осторожны, чтобы не попасть в тупик и бесконечный цикл.Обязательно прочитайте комментарии.


В качестве другого варианта вы также можете обнаружить активацию или деактивацию каждой формы, обработав Activate и Deactivate событие.Когда форма деактивируется, вы можете проверить, находится ли приложение на переднем плане, проверив, имеет ли Form.ActiveForm значение:

private void f_Deactivate(object sender, EventArgs e)
{
    BeginInvoke(new Action(() =>
    {
        if (Form.ActiveForm == null)
            Text = "App Deactivated"; //App deactivated
        else
            Text = "Still Active";   //App is still active
    }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...