有没有可能得到真正的屏幕大小厘米不是像素? 即我需要知道屏幕的大小而不是其分辨率。
我需要这个如果可能在Windows应用程序。
WinRT gridview添加瓦片
如何创build一个大的图标托盘?
LoadBitMap()API是否会创build绘画问题?
有关屏幕(从制造商)的所有信息是在注册表HKLMSYstemCurrentControlSetEnumdisPLAY 。 屏幕的大小是编码,很难找到,但它是可能的。
有关详细信息,请在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(@"SYstemCurrentControlSetEnumdisPLAY"); } 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,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,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的评论。 这可能不准确,所以要小心
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。