C#winforms应用程序:从外部应用程序返回(焦点)时的事件处理程序

时间:2013-08-07 14:19:14

标签: c# winforms event-handling focus

我有一个winforms应用程序,每次从外部应用程序返回时都必须执行操作(即焦点已从我的应用程序丢失,alt-tabbing到另一个程序然后返回)。

是否有应用程序事件处理程序?

我已经查看了Form的activate和deactive处理程序,但是当我的表单从自身获得焦点时(关闭消息框或关闭子表单时),这些处理程序也会被触发。

2 个答案:

答案 0 :(得分:3)

Windows在激活窗口时将WM_ACTIVATEAPP message发送到窗口,并在其停用时发送。所以这就是你想要处理的,特别是当wParamTRUE时(表示激活)。

WinForms不将此事件包装为事件(至少不是我所知道的),因此您需要手动将代码添加到窗体的窗口过程中:

public class MyForm : Form
{
    // other code

    protected override void WndProc(ref Message m)
    {
        const int WM_ACTIVATEAPP = 0x001C;
        switch (m.Msg)
        {
            case WM_ACTIVATEAPP:
            {
                if (m.WParam.ToInt32() != 0)
                {
                    // Your application's window is being activated, so
                    // do whatever it is you want. Or raise an event.
                    ...
                }
                break;
            }
        }
        base.WndProc(ref m);  // proceed with default processing
    }
}

答案 1 :(得分:0)

我只想设置一个bool值,你可以锁定读/写部分,以确保只调用一次动作。