WPFでスクリーンショットの取得
デスクトップ画面などのスクリーンショットを取得する機能は、WPFのAPIとしては用意されていません。
で、どうやったらスクリーンショットを取得できるか調べたのですが、Drawingのメソッドを用いることでスッキリと実装できるようです。
参考リンク
手順
- 参照設定に、System.Drawingを追加
- usingに以下二つを追加
- using System.Drawing;
- using System.Windows.Interop;
- 以下のメソッドを作成
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()); } } } } }