【问题标题】:Keep Window Inactive In Appearance Even When Activated即使在激活时也保持窗口处于非活动状态
【发布时间】:2009-05-01 23:52:35
【问题描述】:

有没有办法让窗口保持非活动状态,即使它包含焦点?我有两种形式(A 和 B)。用户与 A 交互后,我将焦点转移回 B。焦点转移的结果(用户单击 A,然后焦点转移回 B)是表单 A 从活动状态闪烁到非活动状态。这看起来很难看(尤其是在 A 暂时得到更大阴影的 Vista 上)。我怎样才能让 A 保持不活动状态,这样就不会发生这种闪烁?

【问题讨论】:

    标签: .net winforms appearance


    【解决方案1】:

    我终于找到了答案!

    警告:请勿滥用此答案的技术。这样做会使您的用户感到困惑,并且总体上会损害计算体验。下面描述的技术在某些情况下可能非常有用(例如实现类似 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);
    }
    

    【讨论】:

      【解决方案2】:

      您正在谈论更改 gui 模型的默认行为。我不建议这样做。如果用户在 A 上做某事,那么回到 B 不应该 A 消失吗?为什么会“闪烁”?当焦点发生变化时,它应该是一个单一的开关。

      从你的描述看不出焦点切换是这样的:

      A->B
      B->A->用户点击->B
      B->A

      ?

      【讨论】:

      • 我正在尝试模仿 VisualStudio 的智能感知。 A 是建议窗口,B 是用户输入文本的位置。在用户单击 A(更改所选建议等)后,我自动将焦点设置回 B,这样用户就可以继续输入,而无需手动设置焦点。焦点转移是这样的:焦点设置在 B 上,用户单击 A,鼠标向上我将焦点设置回 B。A 暂时获得焦点,导致焦点闪烁(或闪烁),我想停止.
      【解决方案3】:

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

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

      【讨论】:

      • 我尝试了您的建议,但不幸的是,在拥有的窗口和父窗口之间切换焦点仍然会使窗口的外观从非活动变为活动。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多