亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#抓取當前屏幕并保存為圖片的方法

2020-01-24 01:58:47
字體:
來源:轉載
供稿:網友

本文實例講述了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.49028c.com" );   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#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区国产在线观看| 68精品久久久久久欧美| 日韩美女在线播放| 日韩视频精品在线| 成人a视频在线观看| 精品伊人久久97| 欧美精品久久久久久久免费观看| 国产视频亚洲精品| 国产亚洲精品久久久优势| 欧美午夜xxx| 992tv在线成人免费观看| 欧美精品福利视频| 亚洲一区二区三区久久| 成人av在线天堂| 亚洲成人中文字幕| 亚洲人成在线观| 国产成人精品网站| 日韩中文字幕免费视频| 国产婷婷97碰碰久久人人蜜臀| 亚洲免费一在线| 国产精品都在这里| 亚洲区免费影片| 亚洲精品成人av| 欧美老女人xx| 国产日韩欧美电影在线观看| 日韩电影中文字幕av| 中文字幕亚洲无线码a| 亚洲一区美女视频在线观看免费| 国产区精品在线观看| 欧美区二区三区| 国产日韩视频在线观看| 亚洲影院色在线观看免费| 欧美日韩国产一中文字不卡| 在线观看日韩专区| 成人黄色生活片| 亚洲精品国产综合区久久久久久久| 日韩av免费观影| 亚洲第一av在线| 欧美激情精品久久久久久蜜臀| 粉嫩av一区二区三区免费野| 欧美黄色www| 91大神福利视频在线| 好吊成人免视频| 亚洲精品v天堂中文字幕| 精品亚洲精品福利线在观看| 精品国产1区2区| 欧美伦理91i| 2019中文字幕全在线观看| 色综合色综合久久综合频道88| 国产精品视频一区国模私拍| 亚洲美女av网站| 久久九九国产精品怡红院| 亚洲色图综合久久| 日韩av影片在线观看| 国产精品揄拍500视频| 国产精品久久久久福利| 成人福利视频在线观看| 日韩精品亚洲元码| 亚洲精品自拍偷拍| 亚洲黄页视频免费观看| 亚洲国产精品久久久久秋霞不卡| 欧美成人激情图片网| 中文字幕欧美亚洲| 97超级碰碰碰久久久| 2020久久国产精品| 国产精品女主播| 久久久久久久97| 国产女同一区二区| 国产日韩视频在线观看| 中文字幕精品—区二区| 日韩精品视频在线观看免费| 久久久亚洲精选| 亚洲午夜性刺激影院| 精品国产精品三级精品av网址| 国产精品久久久久久亚洲调教| 美女久久久久久久| 亚洲福利视频网站| 成人444kkkk在线观看| 日韩av手机在线观看| 欧美性猛交99久久久久99按摩| 日韩av综合中文字幕| 97超碰色婷婷| 亚洲va久久久噜噜噜久久天堂| 亚洲精品美女久久| 日韩欧美在线视频| 国产精品video| 影音先锋日韩有码| 97视频在线观看网址| 78色国产精品| 日韩成人中文字幕在线观看| 久久九九国产精品怡红院| 欧美日韩国产中文字幕| 成人网欧美在线视频| 日韩欧美国产高清91| **欧美日韩vr在线| 久久久人成影片一区二区三区| 国产亚洲欧美日韩精品| 久久久久久成人精品| 色视频www在线播放国产成人| 欧美丰满老妇厨房牲生活| 久久亚洲春色中文字幕| 欧美华人在线视频| 国产成一区二区| 亚洲精品av在线| 国产精品视频午夜| 91免费视频网站| 一区二区在线免费视频| 欧美激情综合亚洲一二区| 韩日欧美一区二区| 成人免费网站在线观看| 日韩中文字幕视频在线观看| 亚洲精品自拍第一页| 日韩视频欧美视频| 91av在线国产| 亚洲乱码国产乱码精品精天堂| 蜜臀久久99精品久久久久久宅男| 91色视频在线观看| 91精品国产91久久| 久久影视电视剧免费网站清宫辞电视| 韩国美女主播一区| 久久久久久久久久av| 欧美日韩国产在线播放| 韩国一区二区电影| 亚洲欧洲国产伦综合| 国产深夜精品福利| 欧美性xxxxx极品| 2020久久国产精品| 国产成人精品综合久久久| 亚洲国产精品va| 亚洲欧美激情在线视频| 97精品久久久中文字幕免费| 中文字幕视频在线免费欧美日韩综合在线看| 毛片精品免费在线观看| xxx成人少妇69| 少妇高潮久久77777| 欧美精品电影免费在线观看| 最新的欧美黄色| 亚洲国产女人aaa毛片在线| 在线视频日本亚洲性| 欧美性受xxxx黑人猛交| 欧美性猛交xxxx乱大交| 亚洲精品按摩视频| 欧美视频13p| 欧美日韩国产第一页| 国产999精品| 亚洲精品电影久久久| 久久国产精品视频| 日本乱人伦a精品| 色伦专区97中文字幕| 黑人巨大精品欧美一区免费视频| 欧美日韩综合视频| 日本一本a高清免费不卡| 在线播放精品一区二区三区| 福利一区福利二区微拍刺激| 欧美视频二区36p| 久久久久女教师免费一区| 久久久999精品视频| 日本欧美一二三区| 国产免费一区二区三区在线能观看| 成人av.网址在线网站| 亚洲黄色在线看| 影音先锋欧美在线资源| 欧美在线观看网址综合| 国产精品一区二区三区久久|