有没有办法让窗口保持不活动状态,即使它包含焦点?我有两种形式(A 和 B)。用户与 A 交互后,我将焦点转移回 B。焦点转移的结果(用户单击 A,然后焦点转移回 B)是表单 A 从活动状态闪烁到非活动状态。这看起来很难看(尤其是在 A 暂时得到更大阴影的 Vista 上)。我怎样才能让 A 保持不活动状态,这样就不会发生这种闪烁?
3 回答
终于,我找到了答案!
警告: 不要滥用这个答案的技巧。这样做会使您的用户感到困惑,并且通常会损害计算体验。下面描述的技术在某些情况下可能非常有用(例如实现类似 IntelliSense 的行为),但请谨慎使用它。
WM_NCACTIVATE消息被发送到窗口以将其非客户区(即边框和标题栏)的状态更改为非活动或活动。消息的 wParam 指示状态是非活动的还是活动的。如果 wParam 为真(值为 1),则窗口看起来是活动的。如果 wParam 为 false(值为 0),则窗口将看起来不活动。要强制窗口保持非活动或活动状态,请通过将 wParam 设置为相应的值(0 或 1)来覆盖 wParam,然后一切就绪!
private const int WM_NCACTIVATE = 0x0086;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCACTIVATE)
{
// Use this to make it always look inactive:
m.WParam = (IntPtr)0;
// Alternately, use this to make it always look active:
m.WParam = (IntPtr)1;
}
base.WndProc(ref m);
}
您正在谈论更改 gui 模型的默认行为。我不建议这样做。如果用户在 A 上做某事,那么回到 B 不应该 A 消失吗?为什么会“闪烁”?当焦点发生变化时,它应该是一个单一的开关。
从您的描述中无法判断焦点切换,例如:
A->B
B->A->用户点击->B
B->A
?
不确定这是否有帮助,但 Winforms 支持拥有表单的概念。例如,即使浮动工具栏位于顶层窗口之外,即使顶层窗口处于活动状态(反之亦然),它们仍保持活动状态。同样,您希望用户能够与您的表单 A 进行交互,而无需停用表单 B。
要实现这一点,听起来您需要b.AddOwnedForm(a)
在 show 之前调用a
。