检查winform应用程序是否将焦点丢失到其他应用程序

本文关键字:应用程序 其他 winform 是否 检查 焦点 | 更新日期: 2023-09-27 18:25:28

我有一个带有许多子窗体的应用程序,当我切换到不同的应用程序时,有些表单仍然保留在顶部(我使用的是Form.TopMost属性)。

我一直在寻找解决方案,在这里我找到了部分答案:

如何检测应用程序何时失去焦点?

C#表单激活和停用事件

但两者都不适合我。CCD_ 2事件也在主表单失去对子表单的关注时被触发。我想检查我的应用程序是否因不同的应用程序而失去焦点,这样我就可以隐藏所有子窗体。

感谢

编辑:感谢@Hans Passant,我将Form.TopMost切换为Show(所有者)。

检查winform应用程序是否将焦点丢失到其他应用程序

尝试WM_ACTIVATEAPP

覆盖WndProc并检查消息类型和参数。例如,在您的主窗体中,添加以下代码。

protected override void WndProc(ref Message m)
{
    const int WM_ACTIVATEAPP = 0x001C;
    if (m.Msg == WM_ACTIVATEAPP)
    {
        if (m.WParam.ToInt64() == 0) /* Being deactivated */
        {
            /* TODO: */
        }
    }
    base.WndProc(ref m);
}

它对我有效。