【问题标题】:Check if a winform application lost focus to a different application检查 winform 应用程序是否失去焦点到另一个应用程序
【发布时间】:2014-10-04 10:06:59
【问题描述】:

我有一个包含许多子表单的应用程序,当我切换到另一个应用程序时, 一些表单仍然位于顶部(我使用的是Form.TopMost 属性)。

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

How to detect when an application loses focus?

C# form Activated and Deactivate events

但两者都不适合我。 Form.Deactivate 事件也会在主窗体失去焦点到子窗体时触发。 我想检查我的应用程序是否失去了对不同应用程序的关注,因此我可以隐藏所有子表单。

谢谢

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

【问题讨论】:

  • 这是一个 XY 问题。 TopMost 属性被严重滥用,仅在极少数情况下才需要。改用拥有的窗口,Show(owner) 重载来显示它们。
  • @elimad 是的,但我想弄清楚用户是否切换了应用程序,然后隐藏所有表单。
  • @HansPassant,我正在使用 TopMost 作为 Find 表单,我希望它在用户决定关闭它之前一直位于顶部。
  • 这是一个应该是自有窗口的标准示例。

标签: c# winforms show-hide


【解决方案1】:

试试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);
}

它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2011-08-05
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多