2010-02-18 38 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

相关问题