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);
        }
Beispiel #2
0
    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);
    }
Beispiel #3
0
 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));
 }