Skip to content

The Dummy Programmer

Stories of daily programming

  • Home
  • 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

Working with C# async / await keywords (part 2 of 3) C#
Windows 10 search no more working!! Windows 10
Upgrading from Windows 10 Home to Windows 10 Pro Windows 10
Make user interface calls in thread safe way in Windows Forms C#
C# async / await behind the scenes C#
How to install Oracle VirtualBox in a Windows PC Virtualization software

Search

Categories

  • .NET 6 (1)
  • .NET 7 (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 (7)
  • 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 (20)
  • Sql Server 2016 (14)
  • Sql Server 2019 (1)
  • SSL (4)
  • Task scheduler (1)
  • Telerik ASP.NET AJAX (2)
  • The Dummy Programmer Chat (2)
  • Threading (5)
  • Tools (1)
  • TPL (3)
  • TypeScript (3)
  • Ubuntu (4)
  • Virtualization software (3)
  • Visual Studio (1)
  • Visual Studio Code (2)
  • VueJS (1)
  • Web fonts (1)
  • Web programming (6)
  • Windows (12)
  • Windows 10 (15)
  • Windows Forms (1)
  • Windows Server (6)

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

Powered by PressBook Masonry Dark

Manage Cookie Consent
This site doesn’t collect user personal data and doesn’t install profiling or analytical cookies, either its own or from third parties. Read our privacy policy for more info.
Functional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Manage options Manage services Manage {vendor_count} vendors Read more about these purposes
View preferences
{title} {title} {title}