记录桌面截图(排除不需要的桌面视图:例如本身截图软件的视图),一位组内优秀帅小伙伴(https://www.cnblogs.com/wuty/ )的截图实现。
两种方式:方式一是在截图的时候,将截图软件隐藏,然后获取桌面截图,最后再显示;方式二在截图前将指定窗口的句柄通过User32设置隐藏,然后获取桌面截图,最后再通过User32指定句柄设置显示。
当然直接显示隐藏,可能体验不太好,有点突兀,此时可以使用动画设置透明度进行过度。
方式一:
/// <summary>
/// 隐藏窗体,并执行快照
/// </summary>
private void HideWindowSnapShot()
{
//获取当前的窗体,设置隐藏当前的窗体进行截图
_selfWindow.Opacity = 0.3;
var animationHide = new DoubleAnimation()
{
Duration = TimeSpan.FromSeconds(0.2),
From = 0.3,
To = 0,
EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut }
};
animationHide.Completed += AnimationHide_Completed;
_selfWindow.BeginAnimation(UIElement.OpacityProperty, animationHide);
}
private void AnimationHide_Completed(object sender, EventArgs e)
{
GetCurrentScreenSnap();
var animationShow = new DoubleAnimation()
{
Duration = TimeSpan.FromSeconds(0.4),
From = 0,
To = 1,
EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut }
};
_selfWindow.BeginAnimation(UIElement.OpacityProperty, animationShow);
}
/// <summary>
/// 截取桌面的一张快照
/// </summary>
public async void GetCurrentScreenSnap()
{
//获取屏幕截图
var _scanBitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
using var graphics = Graphics.FromImage(_scanBitmap);
graphics.CopyFromScreen(0, 0, 0, new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));
var _scanFile = Path.Combine($"C\\TestScreenSnap\\{DateTime.Now.ToString("yyyyMMddHHmmss")}" + ".png");
await SavaScreenSnapShotAsync(_scanFile, _scanBitmap);
}
/// <summary>
/// 保存屏幕的截图
/// </summary>
/// <param name="filePath"></param>
public Task SavaScreenSnapShotAsync(string filePath, Bitmap bitmap)
{
return Task.Run(() =>
{
//BitmapToBitmapSource
using var ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Png);
var imageSource = new BitmapImage();
imageSource.BeginInit();
imageSource.CacheOption = BitmapCacheOption.OnLoad;
imageSource.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
imageSource.StreamSource = ms;
imageSource.EndInit();
imageSource.Freeze();
//imageSource转成Png保存到本地
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(imageSource));
using var stream = new FileStream(filePath, FileMode.Create);
encoder.Save(stream);
});
}
方式二
private Window _selfWindow;
/// <summary>
/// 加载时获取窗体
/// </summary>
public ICommand LoadedCommand => new ActionCommand<Window>(window=> { _selfWindow = window ; });
//截图实现
User32.ShowWindow((int)intptr, User32.SW_HIDE);
GetCurrentScreenSnap();
User32.ShowWindow((int)intptr, User32.SW_SHOW);
public const int SW_HIDE = 0;
public const int SW_SHOW = 5;
[DllImport("user32.dll")]
public static extern int ShowWindow(int hwnd,int nCmdShow);