▶일반적인 Screen Capture를 하면 Application 상단에 Topmost로 올라가 있는 화면까지 캡쳐가 됩니다.
이러한 것을 방지하기 위해 RenderTargetBitmap를 이용하여 캡쳐하는 예제입니다.
public static void ScreenCapture(FrameworkElement fr, string outFilePath)
{
// System.Windows.Media.VisualTreeHelper를 이용하여 FrameworkElement의 영역을 가져옵니다.
Rect bounds = VisualTreeHelper.GetDescendantBounds(fr);
// 대상의 좌표를 렌더링 대상 디바이스로 변환하는 데 사용할 수 있는 행렬정보를 가져옵니다.
Matrix m = PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformToDevice;
double dx = m.M11; // notice it's divided by 96 already
double dy = m.M22; // notice it's divided by 96 already
double xDpi = 96d / dx;
double yDpi = 96d / dy;
// RenderTargetBitmap으로 targetBitmap을 생성합니다.
var targetBitmap = new RenderTargetBitmap((int)(fr.ActualWidth), (int)(fr.ActualHeight), xDpi, yDpi, PixelFormats.Pbgra32);
targetBitmap.Render(fr);
// PngBitmapEncoder를 이용하여 frame을 추가합니다.
PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(targetBitmap));
// 파일저장합니다.
using (var file = File.OpenWrite(outFilePath))
{
enc.Save(file);
// 메모리스트림을 사용할때.
//enc.Save(Stream);
}
// bitmap을 해제합니다.
targetBitmap.Clear();
}