启用/禁用表单激活

我想禁用一个Form被激活。 要做到这一点,我用这个:

 private const int WS_EX_NOACTIVATE = 0x08000000; protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.ExStyle = WS_EX_NOACTIVATE; return createParams; } } 

这对我的程序的主要活动很好,因为我仍然可以单击按钮, Form将不会激活。 无论前景中的任何节目都在那里。

问题是在我的程序开始时我需要用键盘输入一些文本,并且Form必须是活动的,否则文本将转到前台的程序。

我知道在何时何地我想启用/禁用Form激活的能力,我只是不知道如何。

编辑:当它不能再活动时,我仍然希望表单的按钮是可点击的。 这里的代码就是这样的。 当我想要输入一些文本时,真正的问题是在开头。

NoActivate标志不太受Windows尊重。 你可能有更好的运气拒绝点击消息。

 private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003; protected override void WndProc(ref Message m) { if (m.Msg == WM_MOUSEACTIVATE) { m.Result = (IntPtr)MA_NOACTIVATE; return; } base.WndProc(ref m); } 

这将使点击进入下一个窗口。 如果要完全阻止单击,请使用MA_NOACTIVATEANDEAT = 0x0004而不是MA_NOACTIVATE

如果您不需要这种强大的保护,可以覆盖另一个标志:

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

在互联网上搜索更多后,我发现了一个简单的单行解决方案:

Activate();

不知道这个存在。 使用问题中的代码加上Form_Load上的代码我可以让程序在开始时处于活动状态并保持这种状态直到我更改为另一个程序。 之后,我的程序将永远不会再次活动。 除非我再按一个按钮或调用Activate()的东西。