Form.Show(null)的含义是什么?

3

我有一个窗体需要置于另外两个窗体之上。该窗体应该能够与它所在的两个窗体中的任意一个最小化。通过使用以下代码,我发现可以实现这一点:

form.Show(null);

然而,form.Show()不能像预期那样工作。为什么?我知道我将一个 owner 作为参数传递了进去,但是 owner 是 null。那么为什么窗体行为表现正常呢?

2个回答

10
请注意,Show()是Control类上的一个方法,而Show(IWin32Window)是Form类上的一个方法。这是Show(IWin32Window)方法的内置行为 - 如果owner为null,则使用活动窗口作为owner。Control.Show()没有Owner的概念。您可以通过MS reference源或反编译器进行确认。
IntPtr hWndActive = UnsafeNativeMethods.GetActiveWindow();
IntPtr hWndOwner = owner == null ? hWndActive : Control.GetSafeHandle(owner); 

@P.Brian他的意思是,如果你使用Show(this),它会将新窗口显示为当前窗口的子级。否则,当你使用Show()Show(null)时,它将没有父窗口。在某些情况下,父窗口很有用,例如当您希望在显示子窗口时防止用户与父窗口交互时。 - user586399
@Desolator - 这也是我的假设。显然(从答案中可以看出),Show() 和 Show(null) 完全没有调用相同的逻辑。 - P.Brian.Mackey
@Desolator Show() != Show(null) @Desolator Show()!= Show(null) - roken
@Desolator,实际上,Show()和Show(null)是不同的。Show()是在Control类中,而Show(IWin32Window owner)是在Form类中。因此它们有不同的行为。 - Luc Morin

2
当您将null作为所有者窗口传递时,您强制Show(owner)方法重载自行查找所有者。它会选择活动窗口。那通常是你想要的,但并非总是如此。有几个好理由旋转这个幸运轮。
我不明白问题中“show()不起作用”的部分。如果您调用未带参数的Show(),则该窗体将没有所有者。

我正在钩入一个运行未托管代码的第三方应用程序。我想要设置为父级的窗口在Application.OpenForms中不可用。但是...这个“活动窗口”技巧确实有效,并且似乎能够将未托管的窗口作为父级抓取。 - P.Brian.Mackey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接