winform show 子窗體之後,保持當前窗體的狀態欄激活狀態

爲了提供用戶體驗,有需求是窗體的窗體不搶父窗體的激活狀態,因爲window激活、失活的時候狀態欄會有明顯的改變

以下說的窗體都是Show的情景,不是ShowDialog

 

1.在窗體下使用 ShowWithoutActivation

protected override bool ShowWithoutActivation
{
    get { return true; }
}

 這可以在show的了之後,不會使父窗體失去激活狀態 

 但是當鼠標show的窗體,主窗體還是失活了

 

2.使用消息來進行攔截處理

思路:

1.父窗體 Show子窗體提供Owner

2.子窗體 override  WndProc

3.當子窗體發出WM_ACTIVATE消息的時候,攔截它,然後在發一個消息給主窗體

protected override void WndProc(ref Message m)
{
       switch (m.Msg)
       {
           case 0x6://WM_ACTIVATE
               if (((int)m.WParam & 4369) != 0)
               {
                    //當前窗體激活的時候,給父窗體發激活狀態(騙子)
                    IntPtr rootWindow = Owner.FindForm().Handle;
                    if (rootWindow != IntPtr.Zero)
                        SendMessage(rootWindow, 0x0086 , (IntPtr)1, IntPtr.Zero);
                        //WM_NCACTIVATE 0x0086 :通過改變某個窗口的非客戶區來表示窗口是處於激活還是非激活狀態時,此消息被髮送給該窗口
                }
                base.WndProc(ref m);
                break;

            default:
                base.WndProc(ref m);
                break;
        }
}

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
Form child = new Form();
child.Show(this)

 

完美解決 

如有誤,歡迎指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章