public static List <DisplayInfo> GetDisplays() { var list = new List <DisplayInfo>(); try { User32.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, (IntPtr hMonitor, IntPtr hdcMonitor, ref NativeRect lprcMonitor, IntPtr dwData) => { var mi = new MonitorInfoEx(); mi.Init(); mi.size = Marshal.SizeOf(mi); mi.size = 72; var success = User32.GetMonitorInfo(hMonitor, ref mi); if (success) { var di = new DisplayInfo(); di.MonitorArea = mi.monitor; di.WorkArea = mi.work; di.PrimaryDisplay = (mi.flags & 1) != 0; di.LogicalScreenHeight = GDI32.GetDeviceCaps(hMonitor, (int)GDI32.DeviceCap.VERTRES); di.PhysicalScreenHeight = GDI32.GetDeviceCaps(hMonitor, (int)GDI32.DeviceCap.DESKTOPVERTRES); // TransformToPixels(0, 0, out var x, out var y); uint dpiX; uint dpiY; try { ShCore.GetDpiForMonitor( hMonitor, MonitorDpiType.MDT_EFFECTIVE_DPI, out dpiX, out dpiY ); } catch { dpiX = 96; dpiY = 96; } di.scaleFactor2 = dpiX / 96f; list.Add(di); } else { Logger.Debug("Getting monitor info failed"); } return(true); }, IntPtr.Zero); AddAdditionalInfos(list); } catch (Exception e) { Logger.Exception(e); } return(list); }
private static Monitor ParseMonitor(IntPtr monitorHandle, IntPtr hdc) { var info = new MonitorInfoEx(); //TODO: MonitorInfo not getting filled with data. var a = User32.GetMonitorInfo(new HandleRef(null, monitorHandle), info); var name = new string(info.szDevice).TrimEnd((char)0); var monitor = new Monitor { Handle = monitorHandle, Name = name, FriendlyName = name, NativeBounds = new Rect(info.rcMonitor.Left, info.rcMonitor.Top, info.rcMonitor.Right - info.rcMonitor.Left, info.rcMonitor.Bottom - info.rcMonitor.Top), Bounds = new Rect(info.rcMonitor.Left, info.rcMonitor.Top, info.rcMonitor.Right - info.rcMonitor.Left, info.rcMonitor.Bottom - info.rcMonitor.Top), WorkingArea = new Rect(info.rcWork.Left, info.rcWork.Top, info.rcWork.Right - info.rcWork.Left, info.rcWork.Bottom - info.rcWork.Top), IsPrimary = (info.dwFlags & Constants.MonitorinfoPrimary) != 0 }; #region Extra details try { var display = new DisplayDevices(true); for (uint id = 0; User32.EnumDisplayDevices(null, id, ref display, 0); id++) { var found = display.DeviceName == monitor.Name; var adapter = display.DeviceString; User32.EnumDisplayDevices(display.DeviceName, id, ref display, 0); if (!found) { continue; } monitor.AdapterName = adapter; monitor.FriendlyName = string.IsNullOrWhiteSpace(display.DeviceString) ? LocalizationHelper.Get("S.Recorder.Screen.Name.Internal") : display.DeviceString == "Generic PnP Monitor" ? LocalizationHelper.Get("S.Recorder.Screen.Name.Generic") : display.DeviceString; break; } } catch (Exception ex) { LogWriter.Log(ex, "Impossible to get extra details of screen."); } #endregion #region Screen DPI try { ShCore.GetDpiForMonitor(monitorHandle, DpiTypes.Effective, out var aux, out _); monitor.Dpi = aux > 0 ? (int)aux : 96; } catch (Exception ex) { LogWriter.Log(ex, "Impossible to detect screen DPI."); try { var h = Gdi32.CreateCompatibleDC(IntPtr.Zero); monitor.Dpi = Gdi32.GetDeviceCaps(h, (int)DeviceCaps.LogPixelsX); Gdi32.DeleteDC(h); } catch (Exception e) { LogWriter.Log(e, "Error getting fallback of screen DPI."); } } #endregion return(monitor); }
internal static Dpi GetMonitorDpiCore(IntPtr monitorHandle) { return(ShCore.GetDpiForMonitor(monitorHandle, MonitorDpiType.MdtEffectiveDpi, out var x, out var y) != 0 ? Dpi.Default : new Dpi(x, y)); }