最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#抓取當(dāng)前屏幕并保存為圖片的方法

 更新時(shí)間:2015年04月17日 12:36:23   作者:work24  
這篇文章主要介紹了C#抓取當(dāng)前屏幕并保存為圖片的方法,實(shí)例分析了C#操作圖片的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C#抓取當(dāng)前屏幕并保存為圖片的方法。分享給大家供大家參考。具體分析如下:

這是一個(gè)C#實(shí)現(xiàn)的屏幕抓取程序,可以抓取整個(gè)屏幕保存為指定格式的圖片,并且保存當(dāng)前控制臺(tái)緩存到文本

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.fzitv.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
}

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C# [ImportDll()] 知識(shí)小結(jié)

    C# [ImportDll()] 知識(shí)小結(jié)

    今天小編就為大家分享一篇關(guān)于C# [ImportDll()] 知識(shí)小結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • C#編程實(shí)現(xiàn)取整和取余的方法

    C#編程實(shí)現(xiàn)取整和取余的方法

    這篇文章主要介紹了C#編程實(shí)現(xiàn)取整和取余的方法,結(jié)合實(shí)例形式分析了C#中Math.Celling與Math.Floor函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#集合之可觀察集合的用法

    C#集合之可觀察集合的用法

    這篇文章介紹了C#集合之可觀察集合的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#中word導(dǎo)出功能的騷操作詳解

    C#中word導(dǎo)出功能的騷操作詳解

    這篇文章主要給大家介紹了關(guān)于C#中word導(dǎo)出功能騷操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C#實(shí)現(xiàn)為類和函數(shù)代碼自動(dòng)添加版權(quán)注釋信息的方法

    C#實(shí)現(xiàn)為類和函數(shù)代碼自動(dòng)添加版權(quán)注釋信息的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)為類和函數(shù)代碼自動(dòng)添加版權(quán)注釋信息的方法,主要涉及安裝文件的修改及函數(shù)注釋模板的修改,需要的朋友可以參考下
    2014-09-09
  • 淺談Visual Studio 2019 Vue項(xiàng)目的目錄結(jié)構(gòu)

    淺談Visual Studio 2019 Vue項(xiàng)目的目錄結(jié)構(gòu)

    這篇文章主要介紹了Visual Studio 2019 Vue項(xiàng)目 目錄結(jié)構(gòu),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C#筆記之EF Code First 數(shù)據(jù)模型 數(shù)據(jù)遷移

    C#筆記之EF Code First 數(shù)據(jù)模型 數(shù)據(jù)遷移

    EF 中 Code First 的數(shù)據(jù)遷移網(wǎng)上有很多資料,我這份并沒(méi)什么特別。Code First 創(chuàng)建視圖網(wǎng)上也有很多資料,但好像很麻煩,而且親測(cè)好像是無(wú)效的方法(可能是我太笨,沒(méi)搞成功),我摸索出了一種簡(jiǎn)單有效的方法,這里分享給大家
    2021-09-09
  • C#零基礎(chǔ)學(xué)習(xí)理解委托

    C#零基礎(chǔ)學(xué)習(xí)理解委托

    C#零基礎(chǔ)學(xué)習(xí)理解委托,需要的朋友可以參考一下
    2013-02-02
  • c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)

    c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)

    這篇文章主要介紹了c# WinForm制作圖片編輯工具(可實(shí)現(xiàn)圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#中的HttpWebRequest類介紹

    C#中的HttpWebRequest類介紹

    本文詳細(xì)講解了C#中的HttpWebRequest類,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評(píng)論

景泰县| 深水埗区| 叙永县| 南江县| 高阳县| 武义县| 屏边| 二手房| 瑞安市| 铜梁县| 两当县| 宝山区| 阳曲县| 丰原市| 星座| 右玉县| 舞阳县| 南漳县| 土默特右旗| 泰州市| 厦门市| 大新县| 台北市| 互助| 嘉善县| 达孜县| 建湖县| 武威市| 蒲城县| 定远县| 屏山县| 泾源县| 和平区| 大余县| 郑州市| 柞水县| 兴安县| 遵化市| 镇巴县| 临高县| 石阡县|