2015-10-15 51 views
0

對不起,我沒有提出具體的問題標題。Windows DPI相關問題

我的開發環境是Windows 7和Visual Studio 2010的產品目標爲Windows 7,8和10

問題1: 我怎麼能得到當前DPI設置?

下面的代碼總是會返回96,這是100%DPI比例。

_dpiX = GetDeviceCaps(hdc, LOGPIXELSX); 

問題2: 我怎麼能得到實際的分辨率?

我試圖用不同的選項使用GetSystemMetrics,他們都返回相同的值,這是縮放的分辨率。例如,實際分辨率爲1920 * 1080和175%DPI,它們都返回1097 * 617。

GetSystemMetrics(SM_CXFULLSCREEN) 
GetSystemMetrics(SM_CXSCREEN) 
GetSystemMetrics(SM_CXVIRTUALSCREEN) 

問題3: 我可以設置應用程序不使用DPI可視化功能?

我們有一個解決方法,在屬性 - >兼容性中勾選'禁用高DPI設置的顯示比例縮放'選項並使用'所有用戶的更改設置'。我已經在Visual Studio中將項目DPIAwareness設置爲true,但它什麼也沒有做。

編輯:有人說,如果產品設置爲DPI意識,它不會得到DPI可視化。就我而言,這是一個GUI程序,將一些命令參數傳遞給另一個可執行文件。我在我的項目中將可執行文件DPIAwareness設置爲true。但是GUI沒有做任何事情。因此,如果GUI不是DPI,並且啓動了其他進程,其他進程是否也不知道DPI?

+0

只要你不回答問題3,你就不會在乎1和2.很多很多方法可以讓你自己找到這個,Google「windows啓用dpiawareness」。 –

+0

事實是,如果我可以解決問題3,我可能只是解決問題。關於問題3的核心思想是如何在我的項目中禁用DPI可視化。有人說將DPIAwareness設置爲true會禁用它。但它似乎並不奏效。 – Jerry

回答

0

問題1,你有沒有試過?

monitorhandle = MonitorFromWindow(winH, MONITOR_DEFAULTTONEAREST) 

winH是你的程序的窗口的句柄

MONITOR_DEFAULTTONEAREST = 2

則:

GetDpiForMonitor(monitorhandle, MDT_EFFECTIVE_DPI, PointerToX, PointerToY) 

MDT_EFFECTIVE_DPI = 0

這將檢索PointerToX的DPI設置和PointerToY

然後,您可以96分,如果你需要使用Windows縮放值(* 100場的百分比)

我感到驚訝,如果設置SetProcessDpiAwareness(1)在一開始並沒有幫助爲應刪除需要設置兼容性標誌,但我不希望它在您的程序中自動擴展GUI - 因此問題1的答案!