• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C#将当前屏幕抓取下来保存为图片

OC/C/C++ 水墨上仙 2670次浏览

这是一个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 )
				{
					// Based on code by Simon Mourier (http://www.softfluent.com/)
					// http://stackoverflow.com/questions/12355378/read-from-location-on-console-c-sharp
					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
				{
					// Based on code by Ali Hamdar (http://alihamdar.com/)
					// http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/79efecc4-fa6d-4078-afe4-bb1379bb968b
					// Default values for full screen
					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 = "" )
		{
			/*
			PrintScreen,  Version 1.00
			Save a screenshot as image or save the current console buffer as text
			Usage:   PRINTSCREEN  outputfile  [ /T:type ]  [ /O ]
			Where:   outputfile   is the file to save the screenshot or text to
			         /T:type      specifies the file type: BMP, GIF, JPG, PNG, TIF or TXT
			                      (only required if outputfile extension is different)
			         /O           overwrites an existing file
			
			Credits: Code to read console buffer by Simon Mourier http://www.softfluent.com
			         Code for graphic screenshot by Ali Hamdar    http://alihamdar.com
			
			Written by Rob van der Woude
			http://www.robvanderwoude.com
			*/
			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.softfluent.com" );
			Console.ResetColor( );
			Console.Error.Write( "         Code for graphic screenshot by Ali Hamdar    " );
			Console.ForegroundColor = ConsoleColor.DarkGray;
			Console.Error.WriteLine( "http://alihamdar.com" );
			Console.ResetColor( );
			Console.Error.WriteLine( );
			Console.Error.WriteLine( "Written by Rob van der Woude" );
			Console.Error.WriteLine( "http://www.robvanderwoude.com" );
			return 1;
		}
		#endregion Error Handling
	}
	#region Read From Console Buffer
	// ConsoleReader by Simon Mourier (http://www.softfluent.com/)
	// http://stackoverflow.com/questions/12355378/read-from-location-on-console-c-sharp
	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#将当前屏幕抓取下来保存为图片
喜欢 (0)
加载中……