是否有办法让窗口保持非活动状态,即使它包含焦点?我有两种形式(A和B)。在用户与A交互之后,我将焦点转移回B.焦点转移的结果(用户点击A,然后将焦点转移回B)是A形式从活动闪烁到不活动。这看起来很丑陋(特别是在Vista上,A瞬间变得更大的阴影)。如何让A保持不活动状态,这样就不会发生这种眨眼?

有帮助吗?

解决方案

最后,我找到了答案!

警告:请勿滥用此答案的技巧。 这样做会让您的用户感到困惑,并且一般会对计算体验造成损害。下面描述的技术在某些情况下非常有用(例如,实现类似IntelliSense的行为),但明智地使用它。

WM_NCACTIVATE 消息发送给窗口将其非客户区域(即边框和标题栏)的状态更改为非活动或活动状态。消息的wParam指示状态是处于非活动状态还是活动状态。如果wParam为true(值为1),则窗口将显示为活动状态。如果wParam为false(值为0),则窗口将显示为非活动状态。要强制窗口保持非活动状态或活动状态,请通过将其设置为相应的值(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->乙结果 B-> A->用户点击 - > B
B->一种结果

不确定这是否有帮助,但Winforms支持自有表单的概念。例如,即使浮动工具栏位于顶级窗口之外,即使顶级窗口处于活动状态,它们仍保持活动状态(反之亦然)。同样,您希望用户能够与表单A进行交互,而无需停用表单B.

要实现这一点,听起来你需要在显示 a 之前调用 b.AddOwnedForm(a)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top