2017-05-03 84 views
-1

是否可以獲取特定顯示器的DPI值?每臺顯示器的WPF DPI值

我已經嘗試了所有聯機的方法,但它們總是返回主監視器的值。

實例,我已經使用:

例1

using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
{ 
     dpiX = g.DpiX; 
     dpiY = g.DpiY; 
} 

示例2

PresentationSource source = PresentationSource.FromVisual(this); 

double dpiX, dpiY; 
if (source != null) { 
    dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11; 
    dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22; 
} 

示例3

var dpiXProperty = typeof(SystemParameters).GetProperty("DpiX", BindingFlags.NonPublic | BindingFlags.Static); 
var dpiYProperty = typeof(SystemParameters).GetProperty("Dpi", BindingFlags.NonPublic | BindingFlags.Static); 

var dpiX = (int)dpiXProperty.GetValue(null, null); 
var dpiY = (int)dpiYProperty.GetValue(null, null); 

沒有上述工程於特定顯示器

+0

我對此不完全確定,這就是爲什麼我僅將它置於評論中:恐怕您從Windows獲得的DPI值可能是指在Windows中配置的DPI設置,而不是硬件的實際DPI功能,因此這意味着它是全局性的。它只是幫助應用程序知道要繪製多少個像素,以使其顯示爲一英寸長。而且,獲得硬件的實際DPI可能非常困難,如果不是不可能的話。但讓我們看看其他人是否知道更好。 –

+0

,但您可以爲不同的顯示器指定不同的縮放比例,以便您擁有不同的DPI。 http://jmp.sh/CJLjx2s – gmetax

+0

我沒有訪問W10,所以我無法驗證這一點。要麼它不會在不同的顯示器上設置不同的比例,要麼它設置的比例不是DPI,或者在某些我不知道的地方有一些額外的設置。 –

回答

1

您可以使用:

GetDpiForMonitor 

現在,這取決於你是否曾經說過,如果你的應用程序是DPI意識到與否,如何你可以得到那些每個顯示器的dpi值 - 如果你不是DPI知道的話,那麼你可能會被騙到實際的DP一世。

如果你這樣做:

SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE). 

(或在您的app.manfest設置)。

接下來你可以做的是枚舉監視器,然後調用GetDpiForMonitor來獲取用戶爲每個監視器設置的實際DPI。

您可以使用此代碼使用System.Windows.Forms.ScreenMonitorFromPoint獲取每個屏幕的句柄。

如果你看看:

這裏有一個示例WPF應用程序,有一些幫助器調用(在託管的C++中)...但您可以同樣執行您自己的DLLImport的WIN32 API等。

+0

尚未使其工作,導致項目NativeMethods需要有vs2013,我正在尋找解決方法 – gmetax

+0

只是加載.cs文件...將其添加到您現有的項目....不需要打開該項目,如果你不能 –

+0

它是一個C++項目不是C# – gmetax