2016-09-29 6 views
2

Windows.Formsを呼び出してSendKeysクラスに電話することなく、デスクトップアプリケーションをコンソールアプリケーションでスクリーンショットする方法があるのだろうかと思いました。余分な参照を使わないコンソールアプリケーションでスクリーンショットやスクリーン印刷をすることができます

私はコンパイラを作成したばかりで、純粋なC#コンソールアプリケーションをコンパイルできるだけなので、リファレンスを追加するとうまくいかず、See this link (My question with an answer on codeproject)のエラーがスローされ、スクリーンショットを取るコンソールアプリケーションを作成したい私はそれが欲しいときに。

+0

"私はちょうどコンパイラを作成しました"とは何を意味するのか理解できませんし、なぜリファレンスを追加しないのですか? – benPearce

+1

[画面をビットマップにキャプチャする]の可能な複製(0120-18753) – benPearce

+0

@benPearceあなたが追加したリンクをチェックすると表示されます私のコンパイラのための私のソースコード、そしてあなたは私が持っていた問題を見ることができます、問題は基本的に私は外部参照を使用することができませんでしたが、 –

答えて

2

私はこのクラスを使用してスクリーンショットを作成します。このスクリーンショットはあなたに適しているかどうかを確認してください。フォームを参照せず、代わりにSystem.Drawingを使用します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Runtime.InteropServices; 

namespace ScreenTest 
{ 
    public class PrintScreen 
    { 
     /// <summary> 
     /// Creates an Image object containing a screen shot of the entire desktop 
     /// </summary> 
     /// <returns></returns> 
     public Image CaptureScreen() 
     { 
      return CaptureWindow(User32.GetDesktopWindow()); 
     } 

     /// <summary> 
     /// Creates an Image object containing a screen shot of a specific window 
     /// </summary> 
     /// <param name="handle">The handle to the window. (In windows forms, this is obtained by the Handle property)</param> 
     /// <returns></returns> 
     public Image CaptureWindow(IntPtr handle) 
     { 
      // get te hDC of the target window 
      IntPtr hdcSrc = User32.GetWindowDC(handle); 
      // get the size 
      User32.RECT windowRect = new User32.RECT(); 
      User32.GetWindowRect(handle, ref windowRect); 
      int width = windowRect.right - windowRect.left; 
      int height = windowRect.bottom - windowRect.top; 
      // create a device context we can copy to 
      IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc); 
      // create a bitmap we can copy it to, 
      // using GetDeviceCaps to get the width/height 
      IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height); 
      // select the bitmap object 
      IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap); 
      // bitblt over 
      GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY); 
      // restore selection 
      GDI32.SelectObject(hdcDest, hOld); 
      // clean up 
      GDI32.DeleteDC(hdcDest); 
      User32.ReleaseDC(handle, hdcSrc); 

      // get a .NET image object for it 
      Image img = Image.FromHbitmap(hBitmap); 
      // free up the Bitmap object 
      GDI32.DeleteObject(hBitmap); 

      return img; 
     } 

     /// <summary> 
     /// Captures a screen shot of a specific window, and saves it to a file 
     /// </summary> 
     /// <param name="handle"></param> 
     /// <param name="filename"></param> 
     /// <param name="format"></param> 
     public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format) 
     { 
      Image img = CaptureWindow(handle); 
      img.Save(filename, format); 
     } 

     /// <summary> 
     /// Captures a screen shot of the entire desktop, and saves it to a file 
     /// </summary> 
     /// <param name="filename"></param> 
     /// <param name="format"></param> 
     public void CaptureScreenToFile(string filename, ImageFormat format) 
     { 
      Image img = CaptureScreen(); 
      img.Save(filename, format); 
     } 

     /// <summary> 
     /// Helper class containing Gdi32 API functions 
     /// </summary> 
     private class GDI32 
     { 

      public const int SRCCOPY = 0x00CC0020; // BitBlt dwRop parameter 

      [DllImport("gdi32.dll")] 
      public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, 
       int nWidth, int nHeight, IntPtr hObjectSource, 
       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); 
     } 

     /// <summary> 
     /// Helper class containing User32 API functions 
     /// </summary> 
     private class User32 
     { 
      [StructLayout(LayoutKind.Sequential)] 
      public struct RECT 
      { 
       public int left; 
       public int top; 
       public int right; 
       public int 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 ReleaseDC(IntPtr hWnd, IntPtr hDC); 
      [DllImport("user32.dll")] 
      public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect); 

     } 

} 

ConsoleAppで使用している例です。

using ScreenTest; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Threading.Tasks; 

namespace Screentest 
{ 
    class Program 
    { 
     static DirectoryInfo di; 
     static void Main(string[] args) 
     { 

      args = new string[] { "y" }; 

      if (args[0] == "y") 
      { 

      di = new DirectoryInfo("C:\\ss"); 
      if (!di.Exists){ di.Create(); }      

      PrintScreen ps = new PrintScreen(); 
      ps.CaptureScreenToFile(di + "\\screen.png", System.Drawing.Imaging.ImageFormat.Png); 

      } 


     } 
    } 
} 
+0

固定 - コードをポストに追加しました。 –

+1

外部リンクがそれほど大きな問題を引き起こすとは思わなかった。長いコードブロック –

+0

**モデレータ** - 無視フラグ。それは時代遅れです。おかげでコーディ – MickyD

関連する問題