在C#中打开一个窗体但不让其获得焦点

11

我正在创建一些始终置顶的消息框作为表单,当我打开它们时,我希望它们不会从其他窗体中夺取焦点。我该怎么做?

谢谢。


1
可能是在不窃取焦点的情况下显示表单?的重复问题。 - Breeze
2个回答

16
protected override bool ShowWithoutActivation
{
    get
    {
        return true;
    }
}

在您的表单代码中覆盖此属性,应该就可以解决问题。


7
请注意,如果您的表单具有TopMost属性设置为true,则此方法将无效。如果要在始终位于顶层的表单上使用此方法,您必须重写CreateParams并在ExStyle上设置WS_EX_TOPMOST。 - Aaron Murgatroyd

15

使用Adam和Aaron提供的信息,我花了几分钟时间,但最终成功了。唯一需要做的是确保表单的“最顶层”属性设置为false。这是我使用的代码...

    protected override bool ShowWithoutActivation { get { return true; } }

    protected override CreateParams CreateParams
    {
        get
        {
            //make sure Top Most property on form is set to false
            //otherwise this doesn't work
            int WS_EX_TOPMOST = 0x00000008;
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_TOPMOST;
            return cp;
        }
    }

1
还需要注意的是,上述所有内容仅在使用Show()方法显示窗体时有效,而在使用ShowDialog()方法时无效。 - PaulTheHacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接