Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使窗口始终位于已位于顶部的另一个窗口的顶部?_C#_.net_Winforms - Fatal编程技术网

C# 使窗口始终位于已位于顶部的另一个窗口的顶部?

C# 使窗口始终位于已位于顶部的另一个窗口的顶部?,c#,.net,winforms,C#,.net,Winforms,如何使一个窗口始终位于另一个已始终位于顶部的窗口的顶部?并不是说它必须位于所有其他窗口的顶部,我只需要它位于特定窗口的顶部。 也就是说,你应该能够通过将你的窗口设置为另一个窗口的子窗口来实现这一点。多亏了SLaks的回答和对它的一些评论,我才能够弄清楚如何在我的窗体之间设置子-父关系。我无法使用Form.Show(owner),因为我想放在前面的表单显示在另一个表单之前。我使用Reflector检查了Form.Show(owner)背后的代码,发现在幕后,所有这些都归结为Windows API中

如何使一个窗口始终位于另一个已始终位于顶部的窗口的顶部?并不是说它必须位于所有其他窗口的顶部,我只需要它位于特定窗口的顶部。


也就是说,你应该能够通过将你的窗口设置为另一个窗口的子窗口来实现这一点。

多亏了SLaks的回答和对它的一些评论,我才能够弄清楚如何在我的窗体之间设置子-父关系。我无法使用
Form.Show(owner)
,因为我想放在前面的表单显示在另一个表单之前。我使用Reflector检查了
Form.Show(owner)
背后的代码,发现在幕后,所有这些都归结为Windows API中的代码

LONG SetWindowLong(      
    HWND hWnd,
    int nIndex,
    LONG dwNewLong
);
Form.Show(owner)
使用
-8的
nIndex
调用SetWindowLong。MSDN在线文档不会告诉您,但根据Winuser.h的说法,
nIndex
的可用常量之一是
GWL\u 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));
}

我看过那篇博文,但我并不是说我想让窗口位于所有其他窗口之上,就在某个特定的窗口之上。是的,如果你的第一个模态窗口本身产生了另一个模态窗口,那么它将成为新的最顶部窗口。但是现在您有了原始窗口,第一个模态窗口位于新模态窗口之后,它们不能移动或拖动,如果用户需要隐藏在这些窗口后面的信息,这可能会令人沮丧。@aaronls:他没有创建模态窗口。我的表单不是模态窗口。用户可以在他们之间进行任意程度的交互。两个窗口紧挨着一个,我试图在用户与第一个窗口交互时防止第二个窗口的阴影重叠到第一个窗口中。SLaks是正确的。如果使用Form.Show(owner)方法,则可以在“owner”窗口的顶部保留一个子窗口,而不会阻塞所有者的UI。这称为“无模式”对话框。也适用于顶级windows。感谢发布您的解决方案。太好了!