我有一个 winforms 应用程序,每次从外部应用程序返回时都必须执行一个操作(即我的应用程序已经失去焦点,alt-tabbing 到另一个程序然后返回)。
是否有为此的应用程序事件处理程序?
我已经查看了表单的激活和停用处理程序,但是当我的表单从自身接收到焦点时(关闭消息框或关闭子表单时),这些处理程序也会被触发。
我有一个 winforms 应用程序,每次从外部应用程序返回时都必须执行一个操作(即我的应用程序已经失去焦点,alt-tabbing 到另一个程序然后返回)。
是否有为此的应用程序事件处理程序?
我已经查看了表单的激活和停用处理程序,但是当我的表单从自身接收到焦点时(关闭消息框或关闭子表单时),这些处理程序也会被触发。
Windows 在窗口被激活和被停用时将WM_ACTIVATEAPP
消息发送到窗口。所以这就是你想要处理的,特别是什么时候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
}
}
我只想设置一个布尔值,您可以锁定读/写部分以确保该操作仅被调用一次。