C# Windows应用商店应用程序上的屏幕截图功能

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中发生,但未在用户代码中

我正在为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来捕获失败的异常,现在可以正常工作了。:)