如何让一个窗口始终保持在已经一直处于最顶层的另一个窗口之上?不是要它一直处于所有其他窗口之上,我只需要它保持在特定窗口之上。
感谢SLaks的答案和相关评论, 我成功地解决了如何在我的窗体之间建立父子关系的问题。我不能使用 Form.Show(owner)
,因为我想保持在前面的窗体是在另一个窗体之前显示的。我使用Reflector来查看Form.Show(owner)
背后的代码,并发现其实质上都可以通过 Windows API 中的SetWindowLong来实现。
LONG SetWindowLong(
HWND hWnd,
int nIndex,
LONG dwNewLong
);
Form.Show(owner)
调用了 SetWindowLong
并将 nIndex
设置为 -8
。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));
}
话虽如此,您可以通过将您的窗口设置为另一个窗口的子级来实现它。