Как я могу заставить окно всегда остаться сверху другого окна, которое уже всегда остается на вершине? Не то, чтобы это должно остаться сверху всех других окон, мне просто нужен он для пребывания сверху конкретного окна.
Благодаря ответу SLaks и некоторым комментариям к нему я смог выяснить, как установить родительско-дочерние отношения между моими формами. Я не мог использовать Form.Show (owner)
, потому что форма, которую я хотел оставить впереди, была показана перед другой формой. Я использовал Reflector для изучения кода Form.Show (owner)
и обнаружил, что за кулисами все сводится к SetWindowLong в Windows API.
LONG SetWindowLong(
HWND hWnd,
int nIndex,
LONG dwNewLong
);
Form.Show (владелец)
вызывает 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));
}
Тем не менее, вы должны быть в состоянии сделать это, сделав ваше окно дочерним для другого окна.