Благодаря ответу SLaks и некоторым комментариям к нему, я смог выяснить, как установить отношения «ребенок-родитель» между моими формами. Я не мог использовать Form.Show(owner)
, потому что форма, которую я хотел остаться впереди, была показана до другой формы. Я использовал Reflector для проверки кода, стоящего за Form.Show(owner)
, и обнаружил, что за кадром все это сводится к SetWindowLong в Windows API.
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));
}