Sensei Posted December 26, 2021 Share Posted December 26, 2021 (edited) Merry Christmas! Dear friends, during Christmas we share gifts, so I did not come empty handed, but I have gifts for you. C# scripts that you can compile yourself on your Windows computers (sorry Linux geeks!). ScreenCapture Compilation: On Windows 7+ it should work without any additional installation. On Vista change the version from v3.5 to v3.0, or install .NET Framework v3.5, if needed. On WinXP install .NET Framework v3.5+, if needed. Start, cmd, cd [the location where you stored ScreenCapture.cs] %SYSTEMROOT%\Microsoft.NET\Framework\v3.5\csc ScreenCapture.cs If you are having problems, you can change from v3.5 to the version you have installed. Verify it by dir %SYSTEMROOT%\Microsoft.NET\Framework\v* Usage: e.g. ScreenCapture -d -v %TEMP%\picture.png ScreenCapture -d D:\screen-shots\picture.jpg ScreenCapture D:\screen-shots\image.bmp It will generate image files e.g. picture_20211226_173530.png picture_20211226_173532.jpg image.bmp with datestamp i timestamp included in the file name (thanks to -d option). File name is unique per second. If you want to add milliseconds, modify the dateformat string in line #115 to e.g. string dateformat = "_yyyyMMdd_HHmmss_fff"; https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-display-milliseconds-in-date-and-time-values Assign it to the 3rd mouse button and/or hotkey for quick access and press on demand. Image files will be created in the desired location. Source code: // ScreenCapture v1.0.1 (c) 2021 Sensei // Capture the screen to an image file // // Usage: // ScreenCapture [-d|--datestamp] [-v|--verbose] filename // // Compilation: // %SYSTEMROOT%\Microsoft.NET\Framework\v3.5\csc ScreenCapture.cs // using System; using System.IO; using System.Runtime.InteropServices; using System.Drawing; using System.Drawing.Imaging; using System.Collections.Generic; public class ScreenCapture { private class GDI32 { public const int SRCCOPY = 0x00CC0020; [DllImport("gdi32.dll")] public static extern bool BitBlt( IntPtr hDCDst, int nXDst, int nYDst, int nWidth, int nHeight, IntPtr hDCSrc, int nXSrc, int nYSrc, int dwRop ); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleBitmap( IntPtr hDC, int nWidth, int nHeight ); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC( IntPtr hDC ); [DllImport("gdi32.dll")] public static extern bool DeleteDC( IntPtr hDC ); [DllImport("gdi32.dll")] public static extern bool DeleteObject( IntPtr hObject ); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject( IntPtr hDC, IntPtr hObject ); } private class User32 { [StructLayout(LayoutKind.Sequential)] public struct Rect { public int left, top, right, bottom; } [DllImport("user32.dll")] public static extern IntPtr GetDesktopWindow(); [DllImport("user32.dll")] public static extern IntPtr GetWindowDC( IntPtr hWnd ); [DllImport("user32.dll")] public static extern IntPtr GetWindowRect( IntPtr hWnd, ref Rect rect ); [DllImport("user32.dll")] public static extern IntPtr ReleaseDC( IntPtr hWnd, IntPtr hDC ); [DllImport("user32.dll")] public static extern int SetProcessDPIAware(); } public static Image CaptureScreen() { return CaptureWindow( User32.GetDesktopWindow() ); } public static Image CaptureWindow( IntPtr hWnd ) { IntPtr hDCSrc = User32.GetWindowDC( hWnd ); User32.Rect rect = new User32.Rect(); User32.GetWindowRect( hWnd, ref rect ); int width = rect.right - rect.left; int height = rect.bottom - rect.top; IntPtr hDCDst = GDI32.CreateCompatibleDC( hDCSrc ); IntPtr hBitmap = GDI32.CreateCompatibleBitmap( hDCSrc, width, height ); IntPtr hBitmapOld = GDI32.SelectObject( hDCDst, hBitmap ); GDI32.BitBlt( hDCDst, 0, 0, width, height, hDCSrc, 0, 0, GDI32.SRCCOPY ); GDI32.SelectObject( hDCDst, hBitmapOld ); GDI32.DeleteDC( hDCDst ); User32.ReleaseDC( hWnd, hDCSrc ); Image image = Image.FromHbitmap( hBitmap ); GDI32.DeleteObject( hBitmap ); return( image ); } public static void CaptureScreenToFile( string filename ) { string extension = Path.GetExtension( filename ); if( String.IsNullOrEmpty( extension ) ) throw( new Exception( "Missing extension" ) ); ImageFormat format = GetImageFormatByExtension( extension ); Image image = CaptureScreen(); image.Save( filename, format ); } public static ImageFormat GetImageFormatByExtension( string extension ) { Dictionary<String, ImageFormat> formats = new Dictionary<String, ImageFormat>(); formats.Add( "bmp", ImageFormat.Bmp ); formats.Add( "emf", ImageFormat.Emf ); formats.Add( "exif", ImageFormat.Exif ); formats.Add( "jpg", ImageFormat.Jpeg ); formats.Add( "jpeg", ImageFormat.Jpeg ); formats.Add( "gif", ImageFormat.Gif ); formats.Add( "png", ImageFormat.Png ); formats.Add( "tiff", ImageFormat.Tiff ); formats.Add( "wmf", ImageFormat.Wmf ); try { extension = extension.Substring( 1 ); extension = extension.ToLower(); return( formats[ extension ] ); } catch( Exception e ) { throw( new Exception( "Unknown extension " + extension, e ) ); } } public static void Help() { Console.WriteLine( "ScreenCapture v1.0.1 (c) 2021 Sensei" ); Console.WriteLine( "Usage:" ); Console.WriteLine( "ScreenCapture [-d|--datestamp] [-v|--verbose] filename" ); } public static void Main( string [] args ) { if( Environment.OSVersion.Version.Major >= 6 ) { User32.SetProcessDPIAware(); // Added in Vista OS. } if( args.Length > 0 ) { string dateformat = "_yyyyMMdd_HHmmss"; bool datestamp = false; bool verbose = false; for( int i = args.Length - 2; i >= 0; i-- ) { string arg = args[i]; if( arg.Equals( "-d" ) || arg.Equals( "--datestamp" ) ) { datestamp = true; } else if( arg.Equals( "-v" ) || arg.Equals( "--verbose" ) ) { verbose = true; } } string filename = args[ args.Length - 1 ]; if( datestamp ) { string extension = Path.GetExtension( filename ); filename = filename.Substring( 0, filename.Length - extension.Length ); filename = filename + DateTime.Now.ToString( dateformat ) + extension; } try { CaptureScreenToFile( filename ); if( verbose ) Console.WriteLine( "Screen captured to " + filename ); } catch( Exception e ) { Console.WriteLine( e.Message ); } } else { Help(); } } } Please don't hesitate to share your ideas for improvement. ScreenCapture.cs Edited December 26, 2021 by Sensei Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now