有没有办法在不使用GDI + / WinForms“Graphics”类的情况下检索设备的DPI?

时间:2013-06-26 17:07:22

标签: c# .net windows winapi graphics

是否可以使用本机win api调用从c#获取设备DPI?

我知道如何从Windows窗体应用程序获取dpi,而我当前的代码是:

  Graphics g = Graphics.FromImage(new Bitmap(10, 10));

  var scaleX = g.DpiX / 96.0f;
  var scaleY = g.DpiY / 96.0f;

我想知道这是否是一个可以让事情变得更容易的win api电话。

2 个答案:

答案 0 :(得分:2)

a WMI Query to the Win32_DesktopMonitor class怎么办?

  

PixelsPerXLogicalInch

Data type: uint32
Access type: Read-only
Qualifiers: Units (Pixels per Logical Inch) 
     

沿显示器的x轴(水平方向)的分辨率。

     

PixelsPerYLogicalInch

Data type: uint32
Access type: Read-only
Qualifiers: Units (Pixels per Logical Inch) 
     

沿显示器的y轴(垂直方向)的分辨率。

您可能会使用to this question

ManagementObjectSearcher monitorObjectSearch = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor");

foreach (ManagementObject monitor in monitorObjectSearch.Get())
{
      Debug.WriteLine(monitor["PixelsPerXLogicalInch");
      Debug.WriteLine(monitor["PixelsPerYLogicalInch");
}

还有Windows API Route with GetDeviceCaps,但我读过有some issues with it on Windows 7所以你的里程可能会有所不同。

还有Direct2D GetDesktopDpimentioned by Alex),看起来它需要做一些COM Interop调用,可能也可能不干净,只能使用Direct2D可用的Windows版本。 Direct2D和.NET上的一些additional information

答案 1 :(得分:0)

有api,http://msdn.microsoft.com/en-us/library/windows/desktop/dd371316(v=vs.85).aspx名为getDesktopApi,但我从未使用它。我认为它就像进行任何互操作一样简单。