本文实例讲述了C#抓取当前屏幕并保存为图片的方法。分享给大家供大家参考。具体分析如下:
这是一个C#实现的屏幕抓取程序,可以抓取整个屏幕保存为指定格式的图片,并且保存当前控制台缓存到文本
using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; namespace RobvanderWoude { class PrintScreen { static int Main( string[] args ) { try { string output = string.Empty; bool overwrite = false; bool text = false; ImageFormat type = null; #region Command Line parsing if ( args.Length == 0 ) { return WriteError( ); } foreach ( string arg in args ) { switch ( arg.ToUpper( ).Substring( 0, 2 ) ) { case \"/?\": return WriteError( ); case \"/O\": overwrite = true; break; case \"/T\": if ( text ) { return WriteError( \"Cannot capture current window as bitmap\" ); } switch ( arg.ToUpper( ).Substring( 3 ) ) { case \"BMP\": type = ImageFormat.Bmp; break; case \"GIF\": type = ImageFormat.Gif; break; case \"JPG\": case \"JPEG\": type = ImageFormat.Jpeg; break; case \"PNG\": type = ImageFormat.Png; break; case \"TIF\": case \"TIFF\": type = ImageFormat.Tiff; break; case \"TXT\": text = true; break; default: return WriteError( \"Invalid file format: \\\"\" + arg.Substring( 4 ) + \"\\\"\" ); } break; default: output = arg; break; } } // Check if directory exists if ( !Directory.Exists( Path.GetDirectoryName( output ) ) ) { return WriteError( \"Invalid path for output file: \\\"\" + output + \"\\\"\" ); } // Check if file exists, and if so, if it can be overwritten if ( File.Exists( output ) ) { if ( overwrite ) { File.Delete( output ); } else { return WriteError( \"File exists; use /O to overwrite existing files.\" ); } } if ( type == null && text == false ) { string ext = Path.GetExtension( output ).ToUpper( ); switch ( ext ) { case \".BMP\": type = ImageFormat.Bmp; break; case \".GIF\": type = ImageFormat.Gif; break; case \".JPG\": case \".JPEG\": type = ImageFormat.Jpeg; break; case \".PNG\": type = ImageFormat.Png; break; case \".TIF\": case \".TIFF\": type = ImageFormat.Tiff; break; case \".TXT\": text = true; break; default: return WriteError( \"Invalid file type: \\\"\" + ext + \"\\\"\" ); return 1; } } #endregion Command Line parsing if ( text ) { string readtext = string.Empty; for ( short i = 0; i < (short) Console.BufferHeight; i++ ) { foreach ( string line in ConsoleReader.ReadFromBuffer( 0, i, (short) Console.BufferWidth, 1 ) ) { readtext += line + \"\\n\"; } } StreamWriter file = new StreamWriter( output ); file.Write( readtext ); file.Close( ); } else { int width = Screen.PrimaryScreen.Bounds.Width; int height = Screen.PrimaryScreen.Bounds.Height; int top = 0; int left = 0; Bitmap printscreen = new Bitmap( width, height ); Graphics graphics = Graphics.FromImage( printscreen as Image ); graphics.CopyFromScreen( top, left, 0, 0, printscreen.Size ); printscreen.Save( output, type ); } return 0; } catch ( Exception e ) { Console.Error.WriteLine( e.Message ); return 1; } } #region Error Handling public static int WriteError( string errorMessage = \"\" ) { Console.ResetColor( ); if ( string.IsNullOrEmpty( errorMessage ) == false ) { Console.Error.WriteLine( ); Console.ForegroundColor = ConsoleColor.Red; Console.Error.Write( \"ERROR: \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.WriteLine( errorMessage ); Console.ResetColor( ); } Console.Error.WriteLine( ); Console.Error.WriteLine( \"PrintScreen, Version 1.10\" ); Console.Error.WriteLine( \"Save a screenshot as image or save the current console buffer as text\" ); Console.Error.WriteLine( ); Console.Error.Write( \"Usage: \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.WriteLine( \"PRINTSCREEN outputfile [ /T:type ] [ /O ]\" ); Console.ResetColor( ); Console.Error.WriteLine( ); Console.Error.Write( \"Where: \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"outputfile\" ); Console.ResetColor( ); Console.Error.WriteLine( \" is the file to save the screenshot or text to\" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \" /T:type\" ); Console.ResetColor( ); Console.Error.Write( \" specifies the file type: \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"BMP\" ); Console.ResetColor( ); Console.Error.Write( \", \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"GIF\" ); Console.ResetColor( ); Console.Error.Write( \", \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"JPG\" ); Console.ResetColor( ); Console.Error.Write( \", \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"PNG\" ); Console.ResetColor( ); Console.Error.Write( \", \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"TIF\" ); Console.ResetColor( ); Console.Error.Write( \" or \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.WriteLine( \"TXT\" ); Console.ResetColor( ); Console.Error.Write( \" (only required if \" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \"outputfile\" ); Console.ResetColor( ); Console.Error.WriteLine( \" extension is different)\" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( \" /O\" ); Console.ResetColor( ); Console.Error.WriteLine( \" overwrites an existing file\" ); Console.Error.WriteLine( ); Console.Error.Write( \"Credits: Code to read console buffer by Simon Mourier \" ); Console.ForegroundColor = ConsoleColor.DarkGray; Console.Error.WriteLine( \"http://www.sina.com.cn\" ); Console.ResetColor( ); Console.Error.Write( \" Code for graphic screenshot by Ali Hamdar \" ); Console.ForegroundColor = ConsoleColor.DarkGray; Console.Error.WriteLine( \"http://www.phpstudy.net\" ); Console.ResetColor( ); Console.Error.WriteLine( ); Console.Error.WriteLine( \"Written by Rob van der Woude\" ); Console.Error.WriteLine( \"http://www.qq.com\" ); return 1; } #endregion Error Handling } #region Read From Console Buffer public class ConsoleReader { public static IEnumerable<string> ReadFromBuffer( short x, short y, short width, short height ) { IntPtr buffer = Marshal.AllocHGlobal( width * height * Marshal.SizeOf( typeof( CHAR_INFO ) ) ); if ( buffer == null ) throw new OutOfMemoryException( ); try { COORD coord = new COORD( ); SMALL_RECT rc = new SMALL_RECT( ); rc.Left = x; rc.Top = y; rc.Right = (short) ( x + width - 1 ); rc.Bottom = (short) ( y + height - 1 ); COORD size = new COORD( ); size.X = width; size.Y = height; const int STD_OUTPUT_HANDLE = -11; if ( !ReadConsoleOutput( GetStdHandle( STD_OUTPUT_HANDLE ), buffer, size, coord, ref rc ) ) { // \'Not enough storage is available to process this command\' may be raised for buffer size > 64K (see ReadConsoleOutput doc.) throw new Win32Exception( Marshal.GetLastWin32Error( ) ); } IntPtr ptr = buffer; for ( int h = 0; h < height; h++ ) { StringBuilder sb = new StringBuilder( ); for ( int w = 0; w < width; w++ ) { CHAR_INFO ci = (CHAR_INFO) Marshal.PtrToStructure( ptr, typeof( CHAR_INFO ) ); char[] chars = Console.OutputEncoding.GetChars( ci.charData ); sb.Append( chars[0] ); ptr += Marshal.SizeOf( typeof( CHAR_INFO ) ); } yield return sb.ToString( ); } } finally { Marshal.FreeHGlobal( buffer ); } } [StructLayout( LayoutKind.Sequential )] private struct CHAR_INFO { [MarshalAs( UnmanagedType.ByValArray, SizeConst = 2 )] public byte[] charData; public short attributes; } [StructLayout( LayoutKind.Sequential )] private struct COORD { public short X; public short Y; } [StructLayout( LayoutKind.Sequential )] private struct SMALL_RECT { public short Left; public short Top; public short Right; public short Bottom; } [StructLayout( LayoutKind.Sequential )] private struct CONSOLE_SCREEN_BUFFER_INFO { public COORD dwSize; public COORD dwCursorPosition; public short wAttributes; public SMALL_RECT srWindow; public COORD dwMaximumWindowSize; } [DllImport( \"kernel32.dll\", SetLastError = true )] private static extern bool ReadConsoleOutput( IntPtr hConsoleOutput, IntPtr lpBuffer, COORD dwBufferSize, COORD dwBufferCoord, ref SMALL_RECT lpReadRegion ); [DllImport( \"kernel32.dll\", SetLastError = true )] private static extern IntPtr GetStdHandle( int nStdHandle ); } #endregion Read From Console Buffer }
希望本文所述对大家的C#程序设计有所帮助。
本文地址:https://www.stayed.cn/item/19703
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我