2016-11-08 105 views
3

我有一個應用程序組成的一個主窗口和彈出我想成爲所有其他應用程序的頂部。我們把「窗口A」稱爲主窗口,將「窗口B」稱爲頂層彈出窗口,將「窗口C」稱爲另一個應用程序的窗口。Delphi窗口在所有其他應用程序的頂部,而主窗口在

我在上面使用此代碼設置窗口B:

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

可正常工作,我可以打開其他應用程序(窗口C)和櫥窗內保持在最前面。但是如果我點擊它的窗口標題,「窗口A」會出現在「窗口C」的頂端。當點擊窗口B的任何部分時,是否有辦法阻止主窗口(窗口A)向前移動?

+0

Window A擁有Window A嗎? – andlabs

+0

重寫B的CreateParams以設置WndParent = 0。在此問很多次。順便說一句,你可以使用fsStayOnTop作爲FormStyle。 –

+0

顯然,你將無法在所有其他窗口之上。你會失去想要做同樣的事情的其他窗口。可能A是Win32意義上的B的所有者。做什麼塞爾特克說,讓B是無主的。 –

回答

4

要讓「窗口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),就必須爲 「窗口B」 任務欄按鈕和Alt + Tab鍵圖標。這是正常的,因爲窗口現在不依賴於任何其他激活窗口,它應該有辦法激活它。爲了避免這種情況,您可以使用bsToolWindowbsSizeToolWin作爲BorderStyle,或將隱藏的應用程序窗口用作窗口所有者,方法是將Application.Handle設置爲Params.WndParent

注意,最頂層窗口不具有對其他可能的最頂層窗口的任何優先權,他們中的任何一個都可能被帶到前面。

相關問題