2016-11-08 3 views
3

У меня есть приложение, состоящее из одного главного окна и всплывающего окна. Я хочу быть на вершине всех других приложений. Назовем «Окно А» в главное окно «Окно В» на всплывающее окно и «Окно С» в другое окно приложения.Delphi Window поверх всех других приложений, а главное окно ниже

Я устанавливаю окно B сверху, используя этот код:

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, 
       SWP_NoMove or SWP_NoSize); 

Это работает, как ожидалось, я могу открыть другое приложение (окно C) и окно B держит на вершине. Но если я нажму на его заголовок окна, то «Window A» выйдет вперед, поверх «Window C». Есть ли способ не допустить, чтобы главное окно (Window A) добралось до фронта, щелкнув любую часть окна B ?.

+0

Является ли Window A принадлежащим Window B? – andlabs

+0

Переопределить CreateParams of B, чтобы установить WndParent = 0. Задавалось много раз здесь. BTW, вы можете использовать fsStayOnTop как FormStyle. –

+0

Очевидно, что вы не сможете быть на вершине всех других окон. Вы проиграете другим окнам, которые хотят сделать то же самое. Вероятно, A является владельцем B в смысле Win32. Сделайте то, что говорит Сертак, чтобы сделать B недействительным. –

ответ

4

Чтобы иметь «Window B» всегда сверху, вы можете установить его FormStyle на fsStayOnTop, вам не нужно звонить SetWindowPos. Переопределите CreateParams, чтобы он не был зарегистрирован любым окном, чтобы он не привез с собой своего владельца на фронт, когда он активирован.

type 
    TWindowB = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

procedure TWindowB.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.WndParent := 0; 
end; 

procedure TWindowB.FormCreate(Sender: TObject); 
begin 
    FormStyle := fsStayOnTop; 
end; 

Для нормального окна (например BorderStyle = bsSizeable), вы будете иметь кнопку на панели задач и значок Alt + Tab для "Окно B". Это нормально, так как окно не зависит от какого-либо другого окна для активации сейчас, оно должно иметь средства для его активации. Чтобы этого избежать, вы можете использовать bsToolWindow или bsSizeToolWin как BorderStyle, или скрытое окно приложения в качестве владельца окна, установив Application.Handle на Params.WndParent.

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

Смежные вопросы