SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

WPFでスクリーンショットの取得

デスクトップ画面などのスクリーンショットを取得する機能は、WPFAPIとしては用意されていません。
で、どうやったらスクリーンショットを取得できるか調べたのですが、Drawingのメソッドを用いることでスッキリと実装できるようです。

手順

  1. 参照設定に、System.Drawingを追加
  2. usingに以下二つを追加
    1. using System.Drawing;
    2. using System.Windows.Interop;
  3. 以下のメソッドを作成
private static BitmapSource CopyScreen()
{
    using (var screenBmp = new Bitmap(
        (int)SystemParameters.PrimaryScreenWidth,
        (int)SystemParameters.PrimaryScreenHeight,
        System.Drawing.Imaging.PixelFormat.Format32bppArgb))
    {
        using (var bmpGraphics = Graphics.FromImage(screenBmp))
        {
            bmpGraphics.CopyFromScreen(0, 0, 0, 0, screenBmp.Size);
            return Imaging.CreateBitmapSourceFromHBitmap(
                screenBmp.GetHbitmap(),
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
        }
    }
}

これで、↑のCopyScreenメソッドを呼べば、デスクトップ全体のスクリーンショットが取得できます。

サンプル

ボタンを押したら、スクリーンショットを取得して、Imageコントロールで表示するだけの簡単なサンプル。

MainWindow.xaml

    
        
            
            
        
    

MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
using System.Drawing;
using System.Windows.Interop;
 
namespace ScreenCapture
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            imgCapture.Source = CopyScreen();
        }
 
        private static BitmapSource CopyScreen()
        {
            using (var screenBmp = new Bitmap(
                (int)SystemParameters.PrimaryScreenWidth,
                (int)SystemParameters.PrimaryScreenHeight,
                System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (var bmpGraphics = Graphics.FromImage(screenBmp))
                {
                    bmpGraphics.CopyFromScreen(0, 0, 0, 0, screenBmp.Size);
                    return Imaging.CreateBitmapSourceFromHBitmap(
                        screenBmp.GetHbitmap(),
                        IntPtr.Zero,
                        Int32Rect.Empty,
                        BitmapSizeOptions.FromEmptyOptions());
                }
            }
        }
    }
}