示例#1
0
        private static bool IsProcessPreMonitorDpiAware()
        {
            if (!(Environment.OSVersion.Platform == PlatformID.Win32NT &&
                  (Environment.OSVersion.Version.Major > 6 || Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 2)))
            {
                return(false);
            }

            try
            {
                ShCore.GetProcessDpiAwareness(Process.GetCurrentProcess().Handle, out var awareness);

                switch (awareness)
                {
                case ProcessDpiAwareness.ProcessDpiUnaware:
                case ProcessDpiAwareness.ProcessSystemDpiAware:
                    return(false);

                case ProcessDpiAwareness.ProcessPreMonitorDpiAware:
                    return(true);

                default:
                    return(false);
                }
            }
            catch
            {
                return(false);
            }
        }
        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);
        }
示例#3
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);
    }
示例#4
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));
 }
示例#5
0
        static void Main(string[] Args)
        {
            if (Args.Length == 0)
            {
                Process.Start(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                           "Captura.UI.exe"));

                return;
            }

            ShCore.SetProcessDpiAwareness(ProcessDPIAwareness.ProcessSystemDPIAware);

            ServiceProvider.LoadModule(new CoreModule());
            ServiceProvider.LoadModule(new FakesModule());

            // Hide on Full Screen Screenshot doesn't work on Console
            ServiceProvider.Get <Settings>().UI.HideOnFullScreenShot = false;

            Parser.Default.ParseArguments <StartCmdOptions, ShotCmdOptions, FFmpegCmdOptions, ListCmdOptions>(Args)
            .WithParsed <ListCmdOptions>(Options => List())
            .WithParsed <StartCmdOptions>(Options =>
            {
                Banner();

                using (var vm = ServiceProvider.Get <MainViewModel>())
                {
                    vm.Init(false, false, false, false);

                    // Load settings dummy
                    var dummySettings = new Settings();
                    dummySettings.Load();

                    vm.Settings.WebcamOverlay       = dummySettings.WebcamOverlay;
                    vm.Settings.MousePointerOverlay = dummySettings.MousePointerOverlay;
                    vm.Settings.Clicks     = dummySettings.Clicks;
                    vm.Settings.Keystrokes = dummySettings.Keystrokes;
                    vm.Settings.Elapsed    = dummySettings.Elapsed;

                    // FFmpeg Path
                    vm.Settings.FFmpeg.FolderPath = dummySettings.FFmpeg.FolderPath;

                    foreach (var overlay in dummySettings.Censored)
                    {
                        vm.Settings.Censored.Add(overlay);
                    }

                    foreach (var overlay in dummySettings.TextOverlays)
                    {
                        vm.Settings.TextOverlays.Add(overlay);
                    }

                    foreach (var overlay in dummySettings.ImageOverlays)
                    {
                        vm.Settings.ImageOverlays.Add(overlay);
                    }

                    Start(vm, Options);
                }
            })
            .WithParsed <ShotCmdOptions>(Options =>
            {
                Banner();

                using (var vm = ServiceProvider.Get <MainViewModel>())
                {
                    vm.Init(false, false, false, false);

                    Shot(vm, Options);
                }
            })
            .WithParsed <FFmpegCmdOptions>(Options =>
            {
                Banner();

                FFmpeg(Options);
            });
        }