2010-02-18 81 views

回答

15

感謝SLaks的回答以及對它的一些評論,我能夠弄清楚如何設置我的表單之間的孩子 - 父母關係。我無法使用Form.Show(owner),因爲我想留在前面的表格被顯示爲之前的其他表格。我使用Reflector來檢查Form.Show(owner)背後的代碼,並發現在幕後,它們都可以在Windows API中解析爲SetWindowLong

LONG SetWindowLong(  
    HWND hWnd, 
    int nIndex, 
    LONG dwNewLong 
); 

Form.Show(owner)呼叫均以-8nIndex SetWindowLong函數。 MSDN聯機文檔不會告訴你,但根據Winuser.h可用於nIndex的常量之一是GWL_HWNDPARENT,其值爲-8。一旦我將這些點連接起來,問題就很容易解決。

這下面是如何設置窗口的父,即使它已經顯示:

using System.Runtime.InteropServices; 

[DllImport("user32.dll")] 
public static extern int SetWindowLong(HandleRef hWnd, int nIndex, HandleRef dwNewLong); 

public static void SetOwner(IWin32Window child, IWin32Window owner) 
{ 
    NativeMethods.SetWindowLong(
     new HandleRef(child, child.Handle), 
     -8, // GWL_HWNDPARENT 
     new HandleRef(owner, owner.Handle)); 
} 
+0

感謝您發佈您的解決方案。這很好! – 2010-02-19 03:30:14

2

Don't do this

也就是說,你應該可以通過讓你的窗口成爲另一個窗口的孩子來做到這一點。

+1

我已經看到了博客文章,但我沒有意思,我希望窗口留在上面所有其他窗口,只是在一個特定的窗口。 – 2010-02-18 22:45:22

+1

是的,如果你的第一個模態窗口本身產生了另一個模態窗口,那麼它將成爲頂層窗口中最新的模態窗口。但是現在你有了原始窗口,第一個模態窗口位於新的模態窗口的後面,不能被移動或拖動,如果用戶需要隱藏任何窗口後面的信息,這可能會令人沮喪。 – AaronLS 2010-02-18 22:46:31

+0

@aaronls:他沒有製作一個模態窗口。 – SLaks 2010-02-18 22:49:15