2015-07-10 398 views
1

我在Windows8.1 Surface3平板電腦上通過interop調用GetScaleFactorForMonitor()。它以140的縮放係數進行響應。我在此平板電腦上只有一個顯示器。我將這次調用的標誌設置爲最接近窗口和主顯示,以查看它們是否有差異,並且它們都給出了140.GetScaleFactorForMonitor值與應用的實際比例不匹配

問題是,實際縮放比例是150%。當我去查看Windows中的顯示設置時,它顯示1440x2160,但原始分辨率是960x1440(我從調用Screen.PrimaryScreen.Bounds獲得)。

當調用SystemInformation.PrimaryMonitorSize.Height和Width時,我也會得到960x1440。

我探索了另一條嘗試使用GetDpiForMonitor()的路線。我的想法是,如果我得到原始的DPI,然後縮小的DPI,我可以做一個百分比計算。

它有點類似的作品,但我得到的原始DPI的價值似乎是有效的(縮放的)DPI,反之亦然。對於x和y都有效的DPI,我得到了96,而對於原始的我得到了144。我預計原始數據是一個較低的數字。

這裏是我的電話:

GetDpiForMonitor(MonitorFromWindow(myTextbox.TopLevelControl.Handle, MONITOR_DEFAULTTONEAREST), 
            MONITOR_DPI_TYPE.MDT_Effective_DPI, 
            out effectiveDPIx, 
            out effectiveDPIy); 
GetDpiForMonitor(MonitorFromWindow(myTextbox.TopLevelControl.Handle, MONITOR_DEFAULTTONEAREST), 
            MONITOR_DPI_TYPE.MDT_Raw_DPI, 
            out rawDPIx, 
            out rawDPIy); 

這裏是我使用的是MSDN上的一個的鏡像的結構。

public enum MONITOR_DPI_TYPE : int 
{ 
    MDT_Effective_DPI = 0, 
    MDT_Angular_DPI = 1, 
    MDT_Raw_DPI = 2, 
    MDT_Default = MDT_Effective_DPI 
}; 
+0

我不知道爲什麼'GetScaleFactorForMonitor'沒有返回正確的縮放因子。我可以重新描述你描述的確切行爲。當我應用了150%的比例(測試監視器上的144 DPI,與96系統DPI相比)時,「GetScaleFactorForMonitor」返回140.顯然,自144/96 = 1.5以後,它將返回150。至於你的第二個問題,我懷疑它與你的應用程序中沒有包含一個清單相關,這個清單指明你的顯示器與DPI兼容。請參閱:https://msdn.microsoft.com/en-us/library/windows/desktop/dn469266(v=vs.85).aspx –

+1

我能想到的唯一事情就是'GetScaleFactorForMonitor'基於Windows存儲縮放模式,這些模式實際上與桌面應用程序不同。 (請參閱https://blogs.technet.microsoft.com/askcore/2015/12/08/display-scaling-in-windows-10/,特別是名爲「統一和擴展縮放系統」的部分。)您最好的選擇是使用'GetDpiForMonitor'。即使在最新版本的Windows 10中,每個顯示器擴展支持也被徹底打破了.Windows團隊目前只提供了令人失望的內容。 –

回答

0

你引述的表面Pro中的數字做看上去是錯誤的,但是當我在我的運行同樣的測試,我得到的216原始DPI(這是正確的)。你確定你要求RAW DPI嗎?

MDT_RAW_DPI返回顯示器的物理dpi - 因此,具有相同分辨率的不同尺寸的顯示器會給出不同的答案。

例如:我的主監視器具有23.5" 的物理寬度和水平分辨率3840 3840/23.5 = 163 dpi的

例如:表面親3具有〜10" 的物理寬度和2160的分辨率2160/10 = 216 dpi。

這兩個比賽就是我從MDT_RAW_DPI得到最新上運行Windows 10的(也許他們已經固定的東西嗎?)

這裏是我的測試程序:

https://gist.github.com/toptensoftware/a6b8ca2cfc9ac63e7b6687968db408a2

相關問題