tool__ Ответов: 2

Доступ запрещен в любом каталоге. В WPF


Программа ниже делает снимок главного окна, нажав клавишу "p". В коде нет подчеркнутых красных ошибок.

когда программа запускается и я нажимаю "р", она показывает ошибку на изображении:

изображение — imgbb.com[^]

По-гречески это означает, что доступ к пути запрещен...

какой бы путь я ни выбрал здесь:

Uri path = новый Uri(@"c:\screenshot.png");

он всегда показывает одну и ту же ошибку.

Есть какие-нибудь идеи, что может быть причиной этого или чего не хватает в коде?

Заранее спасибо

Что я уже пробовал:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (linevertical.Visibility == Visibility.Hidden)
            { linevertical.Visibility = Visibility.Visible; }
            else { linevertical.Visibility = Visibility.Hidden; }
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (lineo.Visibility == Visibility.Hidden)
            { lineo.Visibility = Visibility.Visible; }
            else { lineo.Visibility = Visibility.Hidden; }
        }

        private void Mainwindow_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.A)
            {
                lineo.Visibility = Visibility.Hidden;
                linevertical.Visibility = Visibility.Hidden;
            }
            if (e.Key == Key.S)
            {
                lineo.Visibility = Visibility.Visible;
                linevertical.Visibility = Visibility.Visible;

            }

            if (e.Key == Key.P)
            {
                //Set scrollviewer's Content property as UI element to capture full content
                UIElement element = mainwindow.Content as UIElement;
                Uri path = new Uri(@"c:\screenshot.png");
                CaptureScreen(element, path);
            }

        }
            public void CaptureScreen(UIElement source, Uri destination)
            {
                try
                {
                    double Height, renderHeight, Width, renderWidth;

                    Height = renderHeight = source.RenderSize.Height;
                    Width = renderWidth = source.RenderSize.Width;

                    //Specification for target bitmap like width/height pixel etc.
                    RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
                    //creates Visual Brush of UIElement
                    VisualBrush visualBrush = new VisualBrush(source);

                    DrawingVisual drawingVisual = new DrawingVisual();
                    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
                    {
                        //draws image of element
                        drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(0, 0), new Point(Width, Height)));
                    }
                    //renders image
                    renderTarget.Render(drawingVisual);

                    //PNG encoder for creating PNG file
                    PngBitmapEncoder encoder = new PngBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(renderTarget));
                    using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
                    {
                        encoder.Save(stream);
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
            }
    }
}

2 Ответов

Рейтинг:
9

OriginalGriff

Корневой каталог вашего загрузочного диска защищен, поэтому ни один пользователь не может легко изменить его - это функция антивируса / вредоносного ПО всех операционных систем Windows начиная с Vista и вряд ли изменится. На самом деле, доступ к файлам в корне любого диска не рекомендуется, и вы можете ожидать, что получите более строгие ограничения, а не менее.

Видеть здесь: Где я должен хранить свои данные?[^] для некоторых лучших идей.


tool__

Спасибо ребятам за ответы, многие локации вроде бы работают, как и рабочий стол. Возможно, это не подходит для серьезных приложений, чтобы писать в месте расположения исполняемого файла, но в моем случае кажется лучшим решением. Моя программа не имеет установки, это просто exe-файл, и он должен быть запущен с рабочего стола...

Есть ли способ выразить это? для записи в любой каталог, в котором находится исполняемый файл... в любой машине?

tool__

Спасибо ребятам за ответы, многие локации вроде бы работают, как и рабочий стол. Возможно, это не подходит для серьезных приложений, чтобы писать в месте расположения исполняемого файла, но в моем случае кажется лучшим решением. Моя программа не имеет установки, это просто exe-файл, и он должен быть запущен с рабочего стола...

Есть ли способ выразить это? для записи в любой каталог, в котором находится исполняемый файл... в любой машине?

tool__

Спасибо ребятам за ответы, многие локации вроде бы работают, как и рабочий стол. Возможно, это не подходит для серьезных приложений, чтобы писать в месте расположения исполняемого файла, но в моем случае кажется лучшим решением. Моя программа не имеет установки, это просто exe-файл, и он должен быть запущен с рабочего стола...

Есть ли способ выразить это? для записи в любой каталог, в котором находится исполняемый файл... в любой машине?

Рейтинг:
17

Dave Kreskowiak

Да, в Windows Vista или, может быть, 8 и выше корневой каталог C:\ доступен только для чтения обычным пользователям. Пользователи могут создавать папки в корне C:, но не файлы.

Вам придется поместить свой файл скриншота в другое место, более подходящее.

Вы никогда ничего не говорили о том, какие другие пути вы пробовали, поэтому невозможно комментировать их.


tool__

Спасибо ребятам за ответы, многие локации вроде бы работают, как и рабочий стол. Возможно, это не подходит для серьезных приложений, чтобы писать в месте расположения исполняемого файла, но в моем случае кажется лучшим решением. Моя программа не имеет установки, это просто exe-файл, и он должен быть запущен с рабочего стола...

Есть ли способ выразить это? для записи в любой каталог, в котором находится исполняемый файл... в любой машине?