2015-10-31 103 views
2

問題
在windows 8.1(和更新版本)上,DPI設置是每個顯示器。我可以在系統設置中清楚地看到我的主顯示器(筆記本電腦)設置爲125%dpi,而我的備用顯示器設置爲100%dpi。我的應用程序完全是用C#編寫的,而我嘗試過的每個API調用都會導致輔助監視器的DPI不正確。請記住,那我打電話,我處理的初始化這種方法,並已在我的清單中指定的DPI意識到:檢索輔助監視器DPI的正確方法是什麼?

(shcore.dll) 
SetProcessDpiAwareness(PROCESS_DPI_AWARENESS::PROCESS_PER_MONITOR_DPI_AWARE); 

嘗試

(shcore.dll) 
GetDpiForMonitor(hMonitor, MONITOR_DPI_TYPE::MDT_EFFECTIVE_DPI, &dpiX, &dpiY) 

(導致120無論HMONITOR手柄)

(user32.dll) 
IntPtr dC = CreateDC(...); 
double logX = (double)GetDeviceCaps(dC, LOGPIXELSX); 
double logY = (double)GetDeviceCaps(dC, LOGPIXELSY); 

(結果120而不考慮的CreateDC設備名稱的)

顯示器佈局
,嚴重混淆了我,是第一顯示器是矩形{0,0,1920,1080}但第二個顯示器是{2400,0,2400,1350},基本上使得{4800x1350}一個實際的桌面大小和{3840x1080}虛擬桌面大小的另一件事,但是顯示器之間缺少像素,我無法解釋並且我不明白。

    Screen 1 Screen 2 
Actual Pixels: 1920x1080 2400x1350 
Virtual Pixels: 1536x864 1920x1080 
Top-Left Coord: 0x0   2400x0 
Actual DPI:  120 (125%) 96 (100%) 
Returned DPI: 120 (125%) 120 (125%) 

的另一種方式,我可以確認的是,顯示器不同的DPI,是拖整個顯示器之間的邊界的任何DPI感知應用程序的中心點會導致窗口來改變它的大小是整個顯示器一致( WPF默認是這樣做的)。

回答

1

我一直在爲此奮鬥了一天,在發佈問題後不到一個小時,我找到了答案。如果將來有人遇到這個問題,我會在這裏留下問題。

正確的方法來獲得替代監視器DPI是shcore.dllGetDpiForMonitor方法,正如我上面的嘗試。問題是,SetProcessDpiAwareness不能提前調用以在Windows/wpf應用程序中發揮作用。我通過創建一個新的控制檯應用程序和一個新的wpf應用程序並使用最少的代碼對其進行再現來測試此功能控制檯應用程序返回了正確的值,而wpf應用程序返回了不正確的值。

的解決方案是將以下添加到您的清單文件:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware> 
    </windowsSettings> 
</application> 

這裏的關鍵是dpiAware變量的值,它是True/PM,而不是僅僅True,這是什麼使差異。

相關問題