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