涉及到許多與人密切相關的概念,甚至在官方文檔中也經常濫用相關術語。
重要類型的窗口:
頂層窗口:窗口沒有父窗口。應用程序的主窗口幾乎總是一個頂級窗口。它與z順序沒有任何關係。
子窗口:父窗口包含的窗口。他們的位置總是與父母的遺relative區域相關。子窗口通常是「控件」:UI按鈕和編輯框等。
父窗口:有子窗口的Windows。頂級窗戶通常有孩子。但請注意,兒童窗戶也可能有孩子,因此既可以是父母窗口,也可以是兒童窗口。
擁有的窗口:由另一個窗口控制的窗口,但不一定是其他窗口的子窗口。一個例子是浮動工具調色板:它由應用程序中的另一個窗口擁有,但它並未鎖定到該窗口的其他區域。
擁有者窗口:擁有擁有窗口的Windows。
通常的業主/資關係和父/子關係之間的區別並不重要,所以家長和孩子而言通常用於兩種情況下,即使是在文檔。在某些情況下,父字段和參數被重載以表示父母和/或所有者。
重要概念:
頂部z順序的:這字面意思,顯示上述其他窗口的窗口。
活動窗口:模糊概念,但它通常意味着頂層窗口用戶會認爲「當前」窗口。活動窗口通常用特殊的邊框繪製,並且任務欄上的圖塊高亮顯示。活動窗口通常位於或接近所有其他頂級窗口中z順序的頂部,並且它是具有鍵盤焦點的窗口的父級或所有者(可能是間接的)。
鍵盤焦點:表示將接收鍵盤消息的窗口。從概念上講,有一個窗口的鍵盤焦點。有焦點的窗口常常是活動窗口的孩子(或孫輩等)。
前景:活動窗口通常位於前景中。該名稱似乎暗示它位於z順序的頂部,但它確實意味着創建該窗口的線程獲得輕微的優先級提升。該活動窗口通常也是前景窗口。
因此,假設您已打開此瀏覽器窗口,並且您還有一個記事本實例正在運行。如果您在記事本中單擊該文檔,則會發生一連串的消息和狀態更改。你實際上點擊了一個大的編輯框,它是記事本頂層窗口的子窗口。該點擊會導致編輯框被激活,但子窗口不能真正成爲「活動」窗口,因此只需鍵盤焦點並通過其祖先傳遞激活消息,直到它進入頂層窗口。頂層窗口「激活」是通過移動到z順序的頂部,突出顯示其邊界等。它也變成了前景窗口,所以它的線程得到了一些提升,使得UI比其他任何其他視窗。
考慮到這些條款,您可以解析您列出的功能的MSDN描述以梳理出細微的差異。
如果你試圖佈置你的窗口的孩子,只需使用SetWindowPos(或MoveWindow,SizeWindow和ShowWinow)。在其餘函數中,SwitchToThisWindow看起來不贊同,基本上與SetForegroundWindow相同。 (請注意,在許多情況下,除非您是活動應用程序或活動應用程序授予您使用它的權限,否則SetForegroundWindow將不會執行您想要的操作。)BringWindowToTop主要是將窗口置於z-順序(你可以使用SetWindowPos來完成),如果你在頂層窗口調用它,會產生額外的副作用,使其表現得像SetForegroundWindow。
更新: Raymond Chen發佈了clearer distinction between the active window and the foreground window。引用:
前景窗口的概念是當輸入被去同步化以便表達「真正的全局活動窗口」時引入的,與SetActiveWindow相反,它繼續引用本地活動窗口。