C# Windows应用商店应用程序上的屏幕截图功能
我正在为windows应用商店制作一个应用程序,其中一个部分“创建”允许用户将图像拖到背景上,以创建自己的小场景(该应用程序面向儿童)。我正在添加一个屏幕截图按钮,这样用户可以在完成工作后保存他们的工作,我已经完成了所有的编码,没有错误,但一旦我运行它并按下屏幕截图按钮,应用程序就会失败。任何建议或帮助都将不胜感激 当按钮出现故障时,我会收到来自该按钮的消息: 类型为“System.UnauthorizedAccessException”的异常 在mscorlib.dll中发生,但未在用户代码中处理C# Windows应用商店应用程序上的屏幕截图功能,c#,windows,visual-studio-2013,windows-store-apps,windows-store,C#,Windows,Visual Studio 2013,Windows Store Apps,Windows Store,我正在为windows应用商店制作一个应用程序,其中一个部分“创建”允许用户将图像拖到背景上,以创建自己的小场景(该应用程序面向儿童)。我正在添加一个屏幕截图按钮,这样用户可以在完成工作后保存他们的工作,我已经完成了所有的编码,没有错误,但一旦我运行它并按下屏幕截图按钮,应用程序就会失败。任何建议或帮助都将不胜感激 当按钮出现故障时,我会收到来自该按钮的消息: 类型为“System.UnauthorizedAccessException”的异常 在mscorlib.dll中发生,但未在用户代码中
async void btnScreenshot_Click(object sender, RoutedEventArgs e)
{
var bitmap = await SaveScreenshotAsync(controlsGrid);
}
async Task<RenderTargetBitmap> SaveScreenshotAsync(FrameworkElement uielement)
{
var file = await PickSaveImageAsync();
return await SaveToFileAsync(uielement, file);
}
async Task<StorageFile> PickSaveImageAsync()
{
var filePicker = new FileSavePicker();
filePicker.FileTypeChoices.Add("Bitmap", new List<string>() { ".bmp" });
filePicker.FileTypeChoices.Add("JPEG format", new List<string>() { ".jpg" });
filePicker.FileTypeChoices.Add("Compuserve format", new List<string>() { ".gif" });
filePicker.FileTypeChoices.Add("Portable Network Graphics", new List<string>() { ".png" });
filePicker.FileTypeChoices.Add("Tagged Image File Format", new List<string>() { ".tif" });
filePicker.DefaultFileExtension = ".jpg";
filePicker.SuggestedFileName = "screenshot";
filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
filePicker.SettingsIdentifier = "picture picker";
filePicker.CommitButtonText = "Save picture";
return await filePicker.PickSaveFileAsync();
}
async Task<RenderTargetBitmap> SaveToFileAsync(FrameworkElement uielement, StorageFile file)
{
if (file != null)
{
CachedFileManager.DeferUpdates(file);
Guid encoderId = GetBitmapEncoder(file.FileType);
try
{
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
return await CaptureToStreamAsync(uielement, stream, encoderId);
}
}
catch (Exception ex)
{
DisplayMessage(ex.Message);
}
var status = await CachedFileManager.CompleteUpdatesAsync(file);
}
return null;
}
Guid GetBitmapEncoder(string fileType)
{
Guid encoderId = BitmapEncoder.JpegEncoderId;
switch (fileType)
{
case ".bmp":
encoderId = BitmapEncoder.BmpEncoderId;
break;
case ".gif":
encoderId = BitmapEncoder.GifEncoderId;
break;
case ".png":
encoderId = BitmapEncoder.PngEncoderId;
break;
case ".tif":
encoderId = BitmapEncoder.TiffEncoderId;
break;
}
return encoderId;
}
async Task<RenderTargetBitmap> CaptureToStreamAsync(FrameworkElement uielement, IRandomAccessStream stream, Guid encoderId)
{
try
{
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(uielement);
var pixels = await renderTargetBitmap.GetPixelsAsync();
var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
var encoder = await BitmapEncoder.CreateAsync(encoderId, stream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
logicalDpi,
logicalDpi,
pixels.ToArray());
await encoder.FlushAsync();
return renderTargetBitmap;
}
catch (Exception ex)
{
DisplayMessage(ex.Message);
}
return null;
}
async void DisplayMessage(string error)
{
var dialog = new MessageDialog(error);
await dialog.ShowAsync();
}
async void btnScreenshot\u单击(对象发送方,路由目标)
{
var bitmap=等待SaveScreenshotAsync(controlsGrid);
}
异步任务保存屏幕快照异步(FrameworkElement uielement)
{
var file=wait PickSaveImageAsync();
return wait SaveToFileAsync(uielement,file);
}
异步任务PickSaveImageAsync()
{
var filePicker=new FileSavePicker();
filePicker.FileTypeChoices.Add(“位图”,新列表(){.bmp});
filePicker.FileTypeChoices.Add(“JPEG格式”,新列表(){.jpg});
filePicker.FileTypeChoices.Add(“Compuserve格式”,新列表(){.gif});
filePicker.FileTypeChoices.Add(“便携式网络图形”,新列表(){.png});
filePicker.FileTypeChoices.Add(“标记的图像文件格式”,新列表(){.tif});
filePicker.DefaultFileExtension=“.jpg”;
filePicker.SuggestedFileName=“屏幕截图”;
filePicker.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
filePicker.SettingsIdentifier=“图片选择器”;
filePicker.commitbuttonext=“保存图片”;
返回wait-filePicker.PickSaveFileAsync();
}
异步任务SaveToFileAsync(FrameworkElement uielement、StorageFile文件)
{
如果(文件!=null)
{
CachedFileManager.DeferUpdates(文件);
Guid encoderId=GetBitmapEncoder(file.FileType);
尝试
{
使用(var stream=await file.OpenAsync(FileAccessMode.ReadWrite))
{
return wait CaptureToStreamAsync(uielement、stream、encoderId);
}
}
捕获(例外情况除外)
{
显示消息(例如消息);
}
var status=await CachedFileManager.CompleteUpdatesAsync(文件);
}
返回null;
}
Guid GetBitmapEncoder(字符串文件类型)
{
Guid encoderId=BitmapEncoder.JpegEncoderId;
开关(文件类型)
{
大小写“.bmp”:
encoderId=BitmapEncoder.BmpEncoderId;
打破
大小写“.gif”:
encoderId=BitmapEncoder.GifEncoderId;
打破
案例“.png”:
encoderId=BitmapEncoder.PngEncoderId;
打破
案例“.tif”:
encoderId=BitmapEncoder.TiffEncoderId;
打破
}
返回编码区;
}
异步任务CaptureToStreamAsync(FrameworkElement uielement、IRandomaccesstream流、Guid encoderId)
{
尝试
{
var renderTargetBitmap=新建renderTargetBitmap();
等待renderTargetBitmap.RenderAsync(uielement);
var pixels=await renderTargetBitmap.GetPixelsAsync();
var logicalDpi=DisplayInformation.GetForCurrentView().logicalDpi;
var encoder=await BitmapEncoder.CreateAsync(encoderId,stream);
编码器.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode。忽略,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
logicalDpi,
logicalDpi,
像素。ToArray());
等待编码器。FlushAsync();
返回renderTargetBitmap;
}
捕获(例外情况除外)
{
显示消息(例如消息);
}
返回null;
}
异步void DisplayMessage(字符串错误)
{
var dialog=新消息对话框(错误);
wait dialog.ShowAsync();
}
哪一行生成错误?你能在调试器中单步执行并重新编程吗?是否每次都在多个系统上重新编程?我将您的代码复制到一个空白应用程序中,它工作正常(没有错误,screenshot.bmp按预期创建)。错误就在按钮上。我们在一个空白应用程序中编写了代码,它工作正常。。但是,当我们把它添加到我们的主项目中时,当我们尝试使用屏幕截图功能时,它就会运行,然后失败。。我添加了一个try/catch来捕获失败的异常,现在可以正常工作了。:)