我想在C#中创建一个无法接受焦点的表单,即当我单击表单上的按钮时,焦点不会从当前具有焦点的应用程序中被盗.
有关此示例,请参阅Windows屏幕键盘.请注意,单击按钮时,焦点不会从您当前使用的应用程序中获取.
我该如何实现这种行为?
更新:
事实证明它就像覆盖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);
}
}
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)
如果还有其他激活表单的方法,可以以类似的方式抑制它们.