2009-12-08 124 views
1

我見過一個應用程序,通過刪除標題欄和窗口邊框來模擬全屏應用程序。我做了一些研究,發現getWindowLongPtr()。模擬全屏

現在我的問題:我如何找到並識別應用程序並獲得相應的窗口句柄?如何區分應用程序的多個實例(從光盤上的不同位置運行)?


只是爲了使「模擬」更精確。如果您將應用程序設置爲全屏,並且您單擊了不同的顯示器,則會使其本身最小化。如果應用程序在窗口中運行,並且您單擊不同的監視器,則窗口不會更改。如果刪除窗口的邊框並將其放置在左側或右側顯示器上,則仍然可以在不使應用程序最小化的情況下使用另一臺顯示器。它仍然看起來像在其中一個監視器上運行全屏的應用程序。


舉個例子:你可以設置Eve(www.eveonline.com)爲全屏和窗口模式。在全屏模式下,您無法點擊第二臺監視器,而無需使自己最小化。在窗口模式下,你可以。有像evemover這樣的工具可以讓你在一臺監視器上設置你的窗口,看起來像全屏,但是處於窗口模式。這就是我想要的。 Evemover實際上提供了它的一些源代碼,這就是爲什麼我知道使用帶有setWindowLongPtr和setWindowPos的Win32-API完成刪除邊框和設置位置的原因。

+1

你是怎麼意思模擬它的?製作全屏win32應用程序的方法是創建窗口無邊框,沒有標題欄並使屏幕變大。 – Toad 2009-12-08 08:42:06

+1

還有另一種方法 - 初始化DirectX時選擇全屏作爲選項 – 2009-12-08 12:13:40

+0

您可以給出一個示例上下文嗎?你在尋找類似遊戲的行爲嗎?或者(因爲沒有更好的描述),一個Macintosh暴露的行爲(全屏覆蓋,可以輕鬆解散)。最小化丟失焦點會被嚴重使用嗎? – Fox 2009-12-08 13:48:11

回答

2

許多應用程序使用的短語分歧和混亂的應用「全屏」。

簡單的全屏應用程序 - 佔據全屏幕區域。 DirectX應用程序可以請求全屏獨佔模式。這種模式對DirectX應用程序的優點是,可以獨佔訪問(全屏)屏幕,然後允許更改分辨率,位深度等,以及獲得垂直同步同步硬件緩衝的訪問權限,其中屏幕表面翻轉'之間的顯示間隔,以便'撕'不會發生。

無論如何,Windows桌面瞭解'全屏窗口' - 佔據顯示器全部區域並且沒有非客戶端元素的窗口。當創建這樣的窗口時,諸如桌面小工具和任務欄之類的東西會自動隱藏自己。現代遊戲已經把這種模式稱爲「全屏窗口化」。

回到您的問題:'FindWindow'是用於發現其他應用程序窗口的API。獲得創建窗口的應用程序的路徑要困難得多。 GetWindowThreadProcessId可以獲取擁有進程的進程ID。 OpenProcess將爲您提供一個句柄,您可以將它傳遞給QueryFullProcessImageName(在Vista及更高版本上實現)以獲取流程的完整路徑。

0

我想你是指像窗口聚合器這樣的應用程序,它可以「插入」系統並從應用程序之外進行操作。

查看免費軟件應用程序PuttyCM的代碼(用於將Putty(SSH)shell窗口聚合爲標籤)。 IIRC,它確保傳遞給應用程序的窗口指針具有已設置的標誌。

從不同的地方運行的應用程序,你可能需要確定它的一些方法 - 註冊表項/安裝日誌等