爲了提供用戶體驗,有需求是窗體的窗體不搶父窗體的激活狀態,因爲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)
完美解決
如有誤,歡迎指正