2009-05-01 47 views
2

有没有办法让窗口保持非活动状态,即使它包含焦点?我有两种形式(A和B)。在用户与A交互之后,我将焦点转移回B.焦点转移的结果(用户点击A,然后焦点转移回B)是表单A从活动状态闪烁到非活动状态。这看起来很丑陋(尤其是在Vista上,瞬间会有更大的影子)。我如何让A保持非活动状态,以避免这种闪烁现象?即使在激活时仍保持窗口无效外观

回答

11

最后,我找到了答案!

警告:请勿滥用此答案的技术。这样做会混淆您的用户,并且会损害一般的计算体验。下面描述的技术在某些情况下可能非常有用(例如,实施类似智能感知的行为),但在您的使用中明智。

WM_NCACTIVATE消息被发送到一个窗口,将其非客户区域(即边界和标题栏)的状态更改为非活动或活动状态。消息的wParam指示状态是否处于非活动状态或活动状态。如果wParam为真(值为1),该窗口将显示为活动状态。如果wParam为假(值为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); 
} 
0

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

无法从你的描述说是焦点切换,如:

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

+0

我想模仿VisualStudio的intellisense。 A是建议窗口,B是用户输入文本的位置。用户点击A(更改选定的建议等)后,我会自动将焦点设置回B,以便用户不必手动设置焦点即可继续输入。焦点转移是这样的:焦点在B上设置,用户在A上点击,在鼠标上时我将焦点设置回B.瞬间获得焦点,导致焦点闪烁(或闪烁),我想停止。 – 2009-05-02 20:11:35

0

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

要做到这一点,这听起来像你需要调用b.AddOwnedForm(a)您展示a之前。

+0

我尝试了你的建议,但不幸的是,拥有窗口和父窗口之间的焦点切换仍然将窗口的外观从不活动变为活动。 – 2009-05-02 20:17:38