如何在不占用焦点的情况下将表单放在另一个表单的顶部

时间:2011-05-23 11:46:14

标签: c# winforms

我的应用程序需要在满足某些条件时显示任何活动应用程序的光标位置附近的弹出窗口(我的应用程序已知)。

所以我想显示表单(不会从活动应用程序中窃取焦点)。我尝试将ShowWindow与SW_SHOWNOACTIVATE参数一起使用,但这样,我的表单显示在当前活动的表单下。

如何强制我的表单显示在屏幕上活动的任何表单之上而不会窃取输入焦点?

感谢。

2 个答案:

答案 0 :(得分:1)

您想要的是使用您希望保持最佳状态的TopMost属性。

答案 1 :(得分:0)

您需要在弹出窗体中添加一些管道,以便覆盖WM_ACTIVATE消息:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_ACTIVATE)
        {
            if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)
            {
                if (m.LParam != IntPtr.Zero)
                {
                    SetActiveWindow(m.LParam);
                }
                else
                {
                    // Could not find sender, just in-activate it.
                    SetActiveWindow(IntPtr.Zero);
                }
            }
        }

        base.WndProc(ref m);
    } 

确保将以下内容添加到弹出窗体中:

    [DllImport("user32.dll")]
    private extern static IntPtr SetActiveWindow(IntPtr handle);
    private const int WM_ACTIVATE = 6;
    private const int WA_INACTIVE = 0;

您可以像使用其他任何方式一样使用弹出窗体,方法是调用Show()。您可以将其作为TopMost属性的最顶层窗口,与其他窗体一样。