Skip to content

The Dummy Programmer

Stories of daily programming

  • Home
  • The Dummy Programmer Robot
    • Overview
    • Version history & downloads
    • Tutorials
      • TDP Robot – The basics
      • A simple SQL Server backup solution
      • A simple SQL Server backup solution – A next step
  • My other dummy projects
  • Games
    • Space Y: An Asteroids clone
  • Services
    • What’s my user agent
    • What’s my IP address
  • About
  • Toggle search form

Capture screen using C#

Posted on December 28, 2019December 28, 2019 By

In these days I needed to capture the screen in a Windows application I’m developing in C#.

Looking on the Internet, I found several solutions to the problem, but all of them had a defect: they did not work properly if the scale was set a value higher than 100%, as you can see below:

Display Settings

With a scale higher than 100%, the code I found was not able to get the entire screen but only a portion, because Windows, in this case, sets a virtual screen size that is lower than the physical one. The virtual screen size is the one used to create the snapshot.

So, based on the code found on the internet, I developed my own class to capture the screen, and today I want to share it with you:

public class ScreenCapture
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr GetDesktopWindow();

    [DllImport("gdi32.dll")]
    private static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    private enum DeviceCap
    {
        DESKTOPVERTRES = 117,
        DESKTOPHORZRES = 118
    }

    public static Bitmap CaptureDesktop()
    {
        Bitmap ScreenBitmap;
        IntPtr DesktopHwnd = GetDesktopWindow();
        using (Graphics DesktopGr = Graphics.FromHwnd(DesktopHwnd))
        {
            IntPtr DesktopHdc = DesktopGr.GetHdc();
            int XRes = GetDeviceCaps(DesktopHdc, (int)DeviceCap.DESKTOPHORZRES);
            int YRes = GetDeviceCaps(DesktopHdc, (int)DeviceCap.DESKTOPVERTRES);

            ScreenBitmap = new Bitmap(XRes, YRes);

            using (Graphics ScreenBitmapGr = Graphics.FromImage(ScreenBitmap))
            {
                 ScreenBitmapGr.CopyFromScreen(0, 0, 0, 0, new Size(XRes, YRes));
            }
        }

        return ScreenBitmap;
    }
}

Why this code works?

It works because to get the screen size, it uses the Windows function “GetDeviceCaps” called two times: one for the horizontal size and one for the vertical size. Using the options DESKTOPHORZRES and DESKTOPVERTRES the function GetDeviceCaps return the actual size of the screen that you can use to create the snapshot.

Click here to download the full project developed with Visual Studio 2019 Community.

If you want to use it, remember to change the path where to save the snapshot.

Moreover, the application provides a label showing the current mouse coordinates. With a scale higher than 100%, if you bring the mouse pointer in the lower right corner of the screen, you will see that the coordinates do not reflect those of the actual screen size.

See you next year!

Bye bye!!

 

 

 

 

C#, Windows, Windows 10

Post navigation

Previous Post: Get all referencing tables of a table in Sql Server
Next Post: Push notifications library with C# and .NET Framework

Related Posts

Quickly open the startup folder in Windows 10 Windows
C# async / await behind the scenes C#
Make user interface calls in thread safe way in Windows Forms C#
Working with C# async / await keywords (part 2 of 3) C#
A chat program built in C# with .NET socket library C#
Is Environment.TickCount reliable? C#

Search

Categories

  • .NET 6 (1)
  • AJAX (1)
  • Android (2)
  • Apache (4)
  • ASP.NET (9)
  • ASP.NET MVC (3)
  • Avalonia UI (1)
  • BCP (1)
  • Bitlocker (2)
  • C# (14)
  • CentOS (4)
  • ClosedXML (1)
  • CLR (1)
  • DNS (1)
  • Encryption (3)
  • Excel (2)
  • FuelPHP (3)
  • Games (2)
  • Google Chrome (1)
  • GSuite (1)
  • HTML (1)
  • Imagick (2)
  • Javascript (1)
  • Kindle (1)
  • LAMP (3)
  • Linux (6)
  • MariaDB (2)
  • Mathematics (2)
  • MySql (4)
  • NPOI (1)
  • Office 365 (1)
  • Perl (1)
  • PHP (6)
  • Programming (1)
  • Remote desktop (1)
  • SFTP (2)
  • Sockets (3)
  • Sql Server (18)
  • Sql Server 2016 (14)
  • Sql Server 2019 (1)
  • SSL (2)
  • Task scheduler (1)
  • Telerik ASP.NET AJAX (2)
  • The Dummy Programmer Chat (2)
  • The Dummy Programmer Robot (6)
  • Threading (5)
  • Tools (1)
  • TPL (3)
  • TypeScript (3)
  • Ubuntu (4)
  • Virtualization software (3)
  • Visual Studio (1)
  • Visual Studio Code (2)
  • Web fonts (1)
  • Web programming (6)
  • Windows (12)
  • Windows 10 (15)
  • Windows Forms (1)
  • Windows Server (6)

Copyright © 2023 The Dummy Programmer | Privacy Policy | Terms of use |

Powered by PressBook Masonry Dark