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); }
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)); }
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); }); }