即使在激活时仍保持窗口不活动的外观

Zac*_*son 2 .net appearance winforms

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

Zac*_*son 11

最后,我找到了答案!

警告: 不要滥用这个答案的技巧.这样做会使您的用户感到困惑,并且通常会对计算体验造成损害.下面描述的技术在某些情况下非常有用(例如,实现类似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);
}
Run Code Online (Sandbox Code Playgroud)