如何在不关注焦点的情况下将一个表单放置在另一个表单的顶部

问题描述

|| 当满足某些条件时(我的应用程序知道),我的应用程序需要在任何活动应用程序的光标位置附近显示一个弹出窗口。 因此,我想显示表单(不要从活动应用程序中窃取焦点)。我尝试将ShowWindow与SW_SHOWNOACTIVATE参数一起使用,但是通过这种方式,我的表单显示在当前活动的表单下。 如何强制我的表单显示在屏幕上任何活动的表单的顶部,而不会占用输入焦点? 谢谢。     

解决方法

您想要的是使用要保留在顶部的表单的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属性将其设置为最顶层的窗口。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...