应用程序获得/失去焦点事件

时间:2018-12-18 14:39:28

标签: c# .net winforms

我有一个使用无参数Show()-Methode打开某些子窗口的应用程序。因此,子窗口没有所有者,这使它们可以位于主窗口的后面或前面。

现在,我想知道整个应用程序是否获得焦点。有一个活动可以做到吗?

我尝试了OnActivate / OnDeactivate和OnGotFocus / OnLostFocus,它们仅报告单个表单的事件。这意味着,当应用程序失去焦点时,还会触发OnLostFocus事件,而且如果其他窗体也被焦点。

1 个答案:

答案 0 :(得分:2)

您可以在主表单中处理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);
}

注意:正如Hans在comments中已经提到的那样,在使用上述选项时,请注意不要陷入死锁和无限循环。确保您已阅读评论。


作为另一种选择,您还可以通过处理ActivateDeactivate事件来检测每种表单的激活或停用。停用表单后,您可以通过检查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
    }));
}