为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
开满天机 2022-06-18 17:02:32
我有一个使用无参数 Show()-Methode 打开一些子窗口的应用程序。因此子窗口没有所有者,这使它们能够位于主窗口的后面或前面。现在我想知道整个应用程序是否获得或失去焦点。是否有一个事件可以做到这一点?我尝试了 OnActivate/OnDeactivate 和 OnGotFocus/OnLostFocus,它们只报告单个表单的事件。这意味着当应用程序失去焦点时会触发 OnLostFocus 事件,但如果另一个表单获得焦点,也会触发。
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您可以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 在评论中已经提到的,使用上述选项时,应注意不要陷入死锁和无限循环。确保您阅读了评论。


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

    }));

}


查看完整回答
反对 回复 2022-06-18
  • 1 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信