获取屏幕的实际大小

有没有可能得到真正的屏幕大小厘米不是像素? 即我需要知道屏幕的大小而不是其分辨率。

我需要这个如果可能在Windows应用程序。

有关屏幕(从制造商)的所有信息是在注册表HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY 。 屏幕的大小是编码,很难找到,但它是可能的。

有关详细信息,请在Web上搜索:EDID(“扩展显示标识数据”)( http://en.wikipedia.org/wiki/Extended_display_identification_data ,大小为#21和#22的字节)

这里我使用的代码的大小(和更多的信息,但我清理代码,只有大小):

 // Open the Display Reg-Key RegistryKey displayRegistry = Registry.LocalMachine; Boolean isFailed = false; try { displayRegistry = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\DISPLAY"); } catch { isFailed = true; } if (!isFailed & (displayRegistry != null)) { // Get all MonitorIDss foreach (String monitorID in displayRegistry.GetSubKeyNames()) { if (monitorID == name) { RegistryKey monitorIDRegistry = displayRegistry.OpenSubKey(monitorID); if (monitorIDRegistry != null) { // Get all Plug&Play ID's foreach (String subname in monitorIDRegistry.GetSubKeyNames()) { RegistryKey pnpID = monitorIDRegistry.OpenSubKey(subname); if (pnpID != null) { String[] subkeys = pnpID.GetSubKeyNames(); // Check if Monitor is active if (subkeys.Contains("Control")) { if (subkeys.Contains("Device Parameters")) { RegistryKey devParam = pnpID.OpenSubKey("Device Parameters"); Int16 sizeH = 0; Int16 sizeV = 0; // Get the EDID code byte[] edidObj = devParam.GetValue("EDID", null) as byte[]; if (edidObj != null) { sizeH = Convert.ToInt16(Encoding.Default.GetString(edidObj, 0x15, 1)[0]); sizeV = Convert.ToInt16(Encoding.Default.GetString(edidObj, 0x16, 1)[0]); } } } } } } } } } 

大小以厘米为单位(仅为整数)。

你可以用这个物理比率和对角线:

 private static String GetRatio(Double MaxSizeH, Double MaxSizeV) { if (MaxSizeV == 0) { return "undefined"; } Double ratio = MaxSizeH / MaxSizeV; String strRatio = "4/3"; Double ecartRatio = Math.Abs(ratio - (4 / (Double)3)); if (Math.Abs(ratio - (16 / (Double)10)) < ecartRatio) { ecartRatio = Math.Abs(ratio - (16 / (Double)10)); strRatio = "16/10"; } if (Math.Abs(ratio - (16 / (Double)9)) < ecartRatio) { ecartRatio = Math.Abs(ratio - (16 / (Double)9)); strRatio = "16/9"; } return strRatio; } // diagonal in inch private static Double GetDiagonale(Double MaxSizeH, Double MaxSizeV) { return 0.3937 * Math.Sqrt(MaxSizeH * MaxSizeH + MaxSizeV * MaxSizeV); } 

编辑:如何拥有监视器名称(所有连接的监视器):

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DISPLAY_DEVICE { [MarshalAs(UnmanagedType.U4)] public int cb; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string DeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceString; [MarshalAs(UnmanagedType.U4)] public DisplayDeviceStateFlags StateFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceKey; } [Flags] public enum DisplayDeviceStateFlags : int { /// <summary>The device is part of the desktop.</summary> AttachedToDesktop = 0x1, MultiDriver = 0x2, /// <summary>The device is part of the desktop.</summary> PrimaryDevice = 0x4, /// <summary>Represents a pseudo device used to mirror application drawing for remoting or other purposes.</summary> MirroringDriver = 0x8, /// <summary>The device is VGA compatible.</summary> VGACompatible = 0x10, /// <summary>The device is removable; it cannot be the primary display.</summary> Removable = 0x20, /// <summary>The device has more display modes than its output devices support.</summary> ModesPruned = 0x8000000, Remote = 0x4000000, Disconnect = 0x2000000 } [DllImport("User32.dll")] public static extern int EnumDisplayDevices(string lpDevice, int iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags); private static List<NativeMethods.DISPLAY_DEVICE> GetAllDevice() { List<NativeMethods.DISPLAY_DEVICE> devices = new List<NativeMethods.DISPLAY_DEVICE>(); bool error = false; for (int devId = 0; !error; devId++) { try { NativeMethods.DISPLAY_DEVICE device = new NativeMethods.DISPLAY_DEVICE(); device.cb = Marshal.SizeOf(typeof(NativeMethods.DISPLAY_DEVICE)); error = NativeMethods.EnumDisplayDevices(null, devId, ref device, 0) == 0; if (String.IsNullOrWhiteSpace(device.DeviceID) == false) { devices.Add(device); } } catch (Exception) { error = true; } } return devices; } 

并完成:

 List<NativeMethods.DISPLAY_DEVICE> devices = GetAllDevice(); foreach (NativeMethods.DISPLAY_DEVICE device in devices) { NativeMethods.DISPLAY_DEVICE monitor = new NativeMethods.DISPLAY_DEVICE(); monitor.cb = Marshal.SizeOf(typeof(NativeMethods.DISPLAY_DEVICE)); NativeMethods.EnumDisplayDevices(device.DeviceName, 0, ref monitor, 0); String monitorname = monitor.DeviceID.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries).Skip(1).FirstOrDefault(); GetMonitorDetail(monitorname); } 

我找到了这个

 public class NativeMethods { [DllImport("gdi32.dll", EntryPoint = "CreateDC", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CreateDC(string lpszDriver, string lpszDeviceName, string lpszOutput, IntPtr devMode); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)] static extern bool DeleteDC(IntPtr hdc); [DllImport("gdi32.dll", SetLastError = true)] private static extern Int32 GetDeviceCaps(IntPtr hdc, Int32 capindex); private const int LOGPIXELSX = 88; private static int _dpi = -1; public static int DPI { get { if (_dpi != -1) return _dpi; _dpi = 96; try { IntPtr hdc = CreateDC("DISPLAY", null, null, IntPtr.Zero); if (hdc != IntPtr.Zero) { _dpi = GetDeviceCaps(hdc, LOGPIXELSX); if (_dpi == 0) _dpi = 96; DeleteDC(hdc); } } catch (Exception) { } return _dpi; } } } 

使用PInvoke得到关于主题的其他问题的DPI,我张贴在这里,因为我只看到链接。

我会提到这不是一个普遍的事情,我不知道你为什么需要这个。 这听起来像一个AB问题,所以我会说你需要绝对确定你需要使用DPI之前

请看看Lasse V. Karlsen的评论。 这可能不准确,所以要小心