Сделать окно всегда оставаться поверх ДРУГОГО окна, которое уже остается сверху? - PullRequest
8 голосов
/ 19 февраля 2010

Как сделать так, чтобы окно всегда оставалось поверх другого окна, которое уже всегда остается сверху?Не то, чтобы оно оставалось поверх всех остальных окон, мне просто нужно, чтобы оно было поверх определенного окна.

Ответы [ 2 ]

16 голосов
/ 19 февраля 2010

Благодаря ответу 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));
}
2 голосов
/ 19 февраля 2010

Не делай этого .

Тем не менее, вы должны быть в состоянии сделать это, сделав свое окно дочерним для другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...