Windows应用商店应用的屏幕截图功能

时间:2015-04-16 13:30:04

标签: 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();
    }

0 个答案:

没有答案