簡體   English   中英

是否可以修改顯示的來源? (win32)中

[英]Is it possible to modify the origin of a display? (win32)

我有許多我無法修改的應用程序(沒有源代碼),它們被硬編碼為0,0繪制。 通常這不是問題,但是我需要在這些應用程序的外部繪制一個邊界的新項目(kiosk)。 我正在尋找一種方法來改變顯示范圍:

X: 0 to 1200
Y: 0 to 900

類似於:

X: -100 to 1100
Y: -100 to 800

我在MSDN上看到了一些像SetViewportExtEx,SetWorldTransform這樣的函數,但是如果我理解它們,它們就不會對系統進行全局更改。 它們僅適用於當前流程。

我用C ++編程,但如果注冊表/控制面板/等中的設置也可以。

以前有沒有其他人做過這樣的事情?

編輯1:窗口位置硬編碼為0,0

這可能是矯枉過正,但如果你真的希望完全控制它,你總是可以使用API​​掛鈎來攔截Window創建,方法是在目標進程中掛鈎CreateWindow,CreateWindowEx並在將控制權交還給系統之前改變XY坐標。

流行的API掛鈎庫包括: Microsoft DetoursMadshi的madCodeHook和免費的開源EasyHook

我可能采取的路線是使用窗口創建一個shell應用程序,然后使用“SetParent”設置另一個的父項

例如,在C#中我這樣做了......

var info = new ProcessStartInfo {FileName = "NotePad.exe", WindowStyle = ProcessWindowStyle.Normal};
var runProcess = Process.Start(info);
Thread.Sleep(1000);  // ugly, but more just proving a point
SetParent(runProcess.MainWindowHandle, Handle);

它在我的表單窗口中托管了記事本

因此,只需托管窗口,將主機大小調整為客戶端大小+一點,將客戶端放置在您想要的主機窗口中,然后在外面繪制。

十分簡單 :)

你能澄清一下'應用程序硬編碼為0,0'的含義嗎? 這是否意味着他們的窗口位置設置為0,0,或者他們是否有代碼繪制為0,0?

解決方案#1
一種可能的解決方案是使用SetWindowPosition將每個應用程序簡單地移動到您想要的任何位置。

您需要做的就是根據需要枚舉每個調用SetWindowPosition的HWNDS列表。

解決方案#2
將桌面的工作區域設置得更小。 這應該會導致您的應用程序占用工作區域,而不是整個屏幕。 然后,您可以自由地放置您需要的任何其他窗口,手動定位它們,並繪制邊框。

實際上,您可能會考慮將邊框窗口注冊為“app bars”,這會自動調整工作區域的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM