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

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

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

我该如何实现这种行为?

更新:

事实certificate,它就像重写CreateParams属性并将WS_EX_NOACTIVATE添加到扩展窗口样式一样简单。 谢谢你指点我正确的方向!

不幸的是,这会产生不良的副作用,它会与表单移动混淆,即您仍然可以在屏幕上拖放表单,但拖动时不会显示窗口的边框,因此很难精确定位它。

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

要通过鼠标禁用激活:

 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); } } 

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

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

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

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

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