如何在C#中创建"不可聚焦"的表单?

rob*_*jam 12 .net c# winforms

我想在C#中创建一个无法接受焦点的表单,即当我单击表单上的按钮时,焦点不会从当前具有焦点的应用程序中被盗.

有关此示例,请参阅Windows屏幕键盘.请注意,单击按钮时,焦点不会从您当前使用的应用程序中获取.

我该如何实现这种行为?

更新:

事实证明它就像覆盖CreateParams属性和添加WS_EX_NOACTIVATE到扩展窗口样式一样简单.谢谢你指点我正确的方向!

不幸的是,这会带来不良的副作用,它会因形状移动而混乱,即您仍然可以在屏幕上拖放窗体,但拖动时窗口的边框不会显示,因此难以精确定位.

如果有人知道如何解决这个问题,将不胜感激.

max*_*max 9

要通过鼠标禁用激活:

class NonFocusableForm : Form
{
    protected override void DefWndProc(ref Message m)
    {
        const int WM_MOUSEACTIVATE = 0x21;
        const int MA_NOACTIVATE = 0x0003;

        switch(m.Msg)
        {
            case WM_MOUSEACTIVATE:
                m.Result = (IntPtr)MA_NOACTIVATE;
                return;
        }
        base.DefWndProc(ref m);
    }
}
Run Code Online (Sandbox Code Playgroud)

在没有激活的情况下显示表单(在无边框形式的情况下,唯一一种对我有用的方法):

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr handle, int flags);

    NativeMethods.ShowWindow(form.Handle, 8);
Run Code Online (Sandbox Code Playgroud)

执行此操作的标准方法(似乎它不适用于所有表单样式):

    protected override bool ShowWithoutActivation
    {
        get { return true; }
    }
Run Code Online (Sandbox Code Playgroud)

如果还有其他激活表单的方法,可以以类似的方式抑制它们.