С# - сделать снимок экрана на основе таймера

Я пытаюсь создать приложение WinForms, которое делает снимок экрана с заданным интервалом. Я думаю, что мой код правильный, но когда я пытаюсь его запустить, я получаю сообщение об ошибке «System.Runtime.InteropServices.ExternalException не обработано, в GDI+ произошла общая ошибка».

    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    Thread th;
    private static Bitmap bmpScreenshot;
    private static Graphics gfxScreenshot;

    void TakeScreenShot()
    {
        bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
        gfxScreenshot = Graphics.FromImage(bmpScreenshot);
        gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
        bmpScreenshot.Save(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\ScreenCaptures", ImageFormat.Png);
        th.Abort();
    }

    void StartThread(object sender, EventArgs e)
    {
        th = new Thread(new ThreadStart(TakeScreenShot));
        th.Start();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\ScreenCaptures");
        t.Interval = 500;
        t.Tick += new EventHandler(StartThread);
        t.Start();
    }

Строка, которая доставляет мне проблемы:

bmpScreenshot.Save(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\ScreenCaptures", ImageFormat.Png);

Любые идеи о том, что происходит не так? Заранее спасибо.


person Adam P    schedule 31.03.2010    source источник


Ответы (1)


Вам нужно сохранить с фактическим именем файла, например:

bmpScreenshot.Save(Environment.GetFolderPath
    (Environment.SpecialFolder.DesktopDirectory) 
    + @"\ScreenCaptures\newfile.png", ImageFormat.Png);

Ваш код проходит по пути, который не включает имя файла. Кроме того, убедитесь, что Environment.GetFolderPath(...) возвращает путь без "\" в конце, иначе вы получите "\\" в своем пути.

person MusiGenesis    schedule 31.03.2010
comment
Это странно - мне пришлось ввести 3 обратных слэша, чтобы появилось 2. - person MusiGenesis; 31.03.2010