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

C#winforms应用程序:从外部应用程序返回(焦点)时的事件处理程序,c#,winforms,event-handling,focus,C#,Winforms,Event Handling,Focus,我有一个winforms应用程序,每次从外部应用程序返回时都必须执行一个操作(即,我的应用程序失去了焦点,alt Tab切换到另一个程序,然后返回) 是否有此应用程序事件处理程序 我已经研究了表单的激活和取消激活处理程序,但是当表单从自身接收焦点时(关闭messagebox或关闭子表单时),也会触发这些处理程序。我只需要设置一个bool值,您可以锁定读/写部分,以确保该操作只调用一次。在激活和停用窗口时,Windows会将该操作发送到窗口。这就是您想要处理的,特别是当wParam为TRUE(表示

我有一个winforms应用程序,每次从外部应用程序返回时都必须执行一个操作(即,我的应用程序失去了焦点,alt Tab切换到另一个程序,然后返回)

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


我已经研究了表单的激活和取消激活处理程序,但是当表单从自身接收焦点时(关闭messagebox或关闭子表单时),也会触发这些处理程序。

我只需要设置一个bool值,您可以锁定读/写部分,以确保该操作只调用一次。

在激活和停用窗口时,Windows会将该操作发送到窗口。这就是您想要处理的,特别是当
wParam
TRUE
(表示激活)时

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
    }
}

如果您只是有一个bool标志,并在第一次出现后设置它,并且仅在未设置的情况下执行该操作,该怎么办?是的,这就是我当前的解决方案,我只是想知道是否存在这样的事件。不幸的是,WinForms没有
应用程序。已激活的
事件。可以通过捕获
WM_ACTIVATEAPP
消息来实现一个,每当激活或停用应用程序时,该消息将发送到每个打开的
表单
一次。不,只是想确保您收到了赞扬。还提到。感谢您的编辑;-)(整理我的评论;很快就会删除这个。)你说的锁是什么意思?lock语句?如果您仅从UI线程访问布尔变量,则实际上不需要同步访问,这里似乎就是这种情况。@Servy boolean read/write是原子的,对吗?当多线程访问时,我们真的需要锁吗?除了优化,我认为这不是必需的。我说的对吗?@SriramSakthivel您至少需要使用
volatile
,但是是的,它是一种原子读/写。不过,这取决于如何使用它的具体情况,如果需要以原子方式执行读取和写入,那么确实需要进行同步。正如我所说的,所有这些代码可能都在UI线程中,所以它已经被同步了。谢谢,@Zurb。基本正确,但被三位评论家错误地拒绝了。我自己做了编辑。我把大括号放错地方了,我忘了你不能在C#中隐式地比较IntPtr和bool。