Создание скриншота - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени. Есть такой код
            Graphics graph = null;
 
            var bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); //*
           // var bmp = new Bitmap(1920, 1080);  //**
           
            graph = Graphics.FromImage(bmp);
 
            graph.CopyFromScreen(0, 0, 0, 0,bmp.Size);
            
            bmp.Save("filename.bmp");
У меня матрица FullHD, разрешение тоже 1920х1080. При коде (с пометкой "//*" скриншот получается обрезанным - вместо 1920х1080 выходит 1536х864 (Вообще странное разрешение). А если выбрать код (с пометкой "//**"), то все работает вроде нормально, но как быть, если программу надо запускать еа разных компьютерах с разными разрешениями? пробовал несколько кодов, но результата нет. Такой, к примеру, тоже не работает:
string arg = DateTime.Now.ToString("dd.MM.yyyy_HH.mm.ss");
Thread.Sleep(300);
Size size = Screen.PrimaryScreen.Bounds.Size;
Bitmap bitmap = new Bitmap(size.Width, size.Height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
  graphics.CopyFromScreen(Point.Empty, Point.Empty, size);
  string filename = string.Format("{0}\\{1}.jpg", Environment.GetFolderPath(Environment.SpecialFolder.Desktop), arg);
  bitmap.Save(filename, ImageFormat.Jpeg);
}
и этот тоже не работает
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height,
    PixelFormat.Format32bppRgb);
  using (Graphics gr = Graphics.FromImage(bmp))
 {
  gr.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y,
 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
 }
  return bmp;

Решение задачи: «Создание скриншота»

textual
Листинг программы
using Microsoft.Win32;
...
static Size GetTrueScreenSize(Screen screen)
{
    //get system DPI
    var systemDPI = (int)Registry.GetValue("HKEY_CURRENT_USER\\Control Panel\\Desktop", "LogPixels", 96);
 
    using (var graphics = Graphics.FromHwnd(IntPtr.Zero))
    {
        //get graphics DPI
        var dpiX = graphics.DpiX;
        var dpiY = graphics.DpiY;
 
        //get true screen size
        var w = (int)Math.Round(screen.Bounds.Width * systemDPI / dpiX);
        var h = (int)Math.Round(screen.Bounds.Height * systemDPI / dpiY);
 
        return new Size(w, h);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы