Заставьте окно всегда остаться сверху ДРУГОГО окна, которое уже остается на вершине?

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

8
задан Zach Johnson 18 February 2010 в 22:39
поделиться

2 ответа

Благодаря ответу 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));
}
16
ответ дан 5 December 2019 в 09:25
поделиться

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

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

2
ответ дан 5 December 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: