如何在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; } }
如果还有其他激活表单的方法,可以用类似的方式抑制它们。