如何在不转移焦点的情况下将一个窗体放置在另一个窗体的顶部



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

因此,我希望显示该表单(而不会从活动应用程序中窃取焦点)。我尝试使用带有SW_SHONOACTIVATE参数的ShowWindow,但通过这种方式,我的表单显示在当前活动的表单下。

如何在不窃取输入焦点的情况下,强制将我的表单显示在屏幕上任何活动表单的顶部?

谢谢。

您想要的是使用要保持在顶部的表单的TopMost属性。

您需要在弹出窗体中添加一些管道,以便覆盖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属性使其成为最顶部的窗口。

相关内容

最新更新