Приложению необъяснимо не удается захватить скриншоты - PullRequest
0 голосов
/ 31 мая 2018

У меня странная проблема, которую я пытался определить некоторое время.По сути, мое приложение открывает различные URL-адреса с использованием chrome (данные из массива), снимает их, сохраняет их и продолжает циклически проходить по массиву.Приложение успешно запускается и запускается, но по-разному происходит сбой (обычно между 2-5 днями).Когда происходит сбой, Chrome больше не открывается, но приложение продолжает работать.Вот ошибка, которая возникает из моих попыток / ловит:

в System.Drawing.Graphics.CopyFromScreen (Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, размер blockRegionSize, CopyPixelOperation copyPixelOperation)at Command_Center_Screen_Capture_Agent.Form1.Capture (String name)

Моя единственная рабочая теория сейчас заключается в том, что может быть проблема с памятью, поскольку она не может сделать снимок и не может открыть браузер, ноЯ не уверен, как проверить эту теорию.

{ОБНОВЛЕНИЕ} Просматривая журналы на всех моих серверах, я заметил, что, хотя только некоторые из них имели ошибку выше, все они имели следующую ошибку:

в System.Drawing.Image.Save (строковое имя файла, кодировщик ImageCodecInfo, EncoderParameters encoderParams) в System.Drawing.Image.Save (строковое имя файла, формат ImageFormat) в Command_Center_Screen_Capture_Agent.Form1.Capture (имя строки) в SERVER REDACTED \ Visual Studio 2012 \ Проекты \ Command Center Screen Capture Agent \ Command Center Screen Capture Agent \ Form1.cs: строка 170

Эта ошибка всегда является последней ошибкой до того, как система прекратила запись в журнал и (теоретически) не удалась.

Код, о котором идет речь:

            try
        {
            GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                        Screen.PrimaryScreen.Bounds.Y,
                                        0,
                                        0,
                                        Screen.PrimaryScreen.Bounds.Size,
                                        CopyPixelOperation.SourceCopy);
        }
        catch (Exception e)
        {
            //Noticed without this if the program was running before skyvision was opened an occasional error popped up
            error_logging(e.StackTrace);
        }
        // Save the screenshot to the specified path
        try
        {
            String filePath = @"\" + pictureNames[count] + ".png";
            // MessageBox.Show("Saving file to: " + FILEPATH_LOCATION + forTesting);
            BIT.Save(@FILEPATH_LOCATION + @filePath, ImageFormat.Png);
            System.Threading.Thread.Sleep(2000);
            count++;
            _capture.Enabled = true;
        }
        catch (Exception e)
        {
            error_logging(e.StackTrace);
            //Save error without breaking in case issue with path
            //MessageBox.Show("CAPTURE ERROR: \n\n" + e.StackTrace);
        }

Полный исходный код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
using System.Diagnostics;
using System.IO;
using System.Configuration;

namespace Command_Center_Screen_Capture_Agent
{
    public partial class Form1 : MaterialSkin.Controls.MaterialForm
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Array storage for URLs and pic names
        public static String[] URLS;
        public static String[] pictureNames; //Used to save picture by name


        //Data
        static List<String> URL_LIST = new List<String>();
        static List<String> URL_DESC = new List<String>();
        static String base_url_1 = "URL_OMITTED";
        static String base_url_2 = "URL_OMITTED";
        static Configuration configManager = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        int count = 0;

        //Create a new bitmap.
        static Image BIT = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                       Screen.PrimaryScreen.Bounds.Height,
                                       PixelFormat.Format32bppArgb);
        // Create a graphics object from the bitmap.
        Graphics GFX = Graphics.FromImage(BIT);

        string FILEPATH_LOCATION = (@"FILEPATH_OMITTED");
        string ERROR_LOGGING = Path.Combine(Application.StartupPath, "Error Logs");

        private void error_logging(string line)
        {
            try
            {
                Guid filename = Guid.NewGuid();
                string targetPath = Path.Combine(ERROR_LOGGING, filename + ".txt");
                using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(targetPath))
                {
                    file.WriteLine(line);
                }
            }
            catch (Exception E)
            {
                MessageBox.Show("Failure Writing Error log. " + E.StackTrace);
            }
        }

        private void load_data()
        {
            //Attempt to load data
            try
            {
                string line;
                System.IO.StreamReader file =
                    new System.IO.StreamReader(AppDomain.CurrentDomain.BaseDirectory + "data.txt");
                while ((line = file.ReadLine()) != null)
                {
                    if (line.Contains("SERVERS:"))
                    {
                        URL_LIST = line.Substring(8).Split(',').ToList();
                    }
                    if (line.Contains("DESC:"))
                    {
                        URL_DESC = line.Substring(5).Split(',').ToList();
                    }
                }

                file.Close();
            }
            catch (Exception criticalError)
            {
                MessageBox.Show("Critical Error. Could not access data file. Closing application. \n\n" + criticalError.StackTrace);
                Application.Exit();
            }
        }

        private void build_error_log()
        {
            if (!Directory.Exists(ERROR_LOGGING))
            {
                Directory.CreateDirectory(ERROR_LOGGING);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            build_error_log();
            load_data();
            Checkpath();
            cycleTimeTxtBx.Text = Properties.Settings.Default.TimeToLoadPage.ToString();
        }

        private bool Checkpath()
        {
            this.Hide();
            if (Directory.Exists(FILEPATH_LOCATION))
            {
                return (true);
            }
            else
            {
                DirectoryInfo dir = Directory.CreateDirectory(FILEPATH_LOCATION);
                return false;
            }
        }

        private void Capture(string name)
        {
            try
            {
                if (!Checkpath())
                {
                    System.Threading.Thread.Sleep(1000);
                }
            }
            catch (Exception whoops)
            {
                error_logging(whoops.StackTrace);
                //Console.WriteLine(whoops);
            }
            // Take the screenshot from the upper left corner to the right bottom corner.
            try
            {
                GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                            Screen.PrimaryScreen.Bounds.Y,
                                            0,
                                            0,
                                            Screen.PrimaryScreen.Bounds.Size,
                                            CopyPixelOperation.SourceCopy);
            }
            catch (Exception e)
            {
                error_logging(e.StackTrace);
            }
            // Save the screenshot to the specified path
            try
            {
                String filePath = @"\" + pictureNames[count] + ".png";
                BIT.Save(@FILEPATH_LOCATION + @filePath, ImageFormat.Png);
                System.Threading.Thread.Sleep(2000);
                count++;
                _capture.Enabled = true;
            }
            catch (Exception e)
            {
                error_logging(e.StackTrace);
                //Save error without breaking in case issue with path
                //MessageBox.Show("CAPTURE ERROR: \n\n" + e.StackTrace);
            }
            KillChrome();
        }

        private void KillChrome()
        {
            try
            {
                Process[] procsChrome = Process.GetProcessesByName("chrome");
                foreach (Process pro in procsChrome)
                {
                    pro.Kill();
                }
            }
            catch (Exception e)
            {
                error_logging(e.StackTrace);
                Console.WriteLine(e);
            }
        }


        private void _capture_Tick(object sender, EventArgs e)
        {
            //Assume that the URL array hasn't been setup
            if (URLS == null || URLS.Length < 1)
            {
                URLS = URL_LIST.ToArray();
                pictureNames = URL_DESC.ToArray();
            }
            try
            {
                Process process = new Process();
                process.StartInfo.FileName = "chrome.exe";


                if (count < URLS.Length)
                {
                    string sysCode = URLS[count];
                    string market;
                    int delimIndex = sysCode.IndexOf("|");
                    market = sysCode.Substring(delimIndex + 1);
                    sysCode = sysCode.Substring(0, delimIndex);
                    string useable_url = base_url_1 + sysCode + base_url_2 + market;
                    process.StartInfo.Arguments = useable_url + " --start-maximized --incognito --new-window";
                }
                else
                {
                    count = 0;
                    string sysCode = URLS[count];
                    string market;
                    int delimIndex = sysCode.IndexOf("|");
                    market = sysCode.Substring(delimIndex + 1);
                    sysCode = sysCode.Substring(0, delimIndex);
                    string useable_url = base_url_1 + sysCode + base_url_2 + market;
                    process.StartInfo.Arguments = useable_url + " --start-maximized --incognito --new-window";
                }
                process.Start();
                _capture.Enabled = false;
                System.Threading.Thread.Sleep(Properties.Settings.Default.TimeToLoadPage * 1000);
                Capture("no");
            }
            catch (Exception error)
            {
                error_logging(error.StackTrace);
                //MessageBox.Show(error.StackTrace);
            }
        }

        private void startBTN_Click(object sender, EventArgs e)
        {
            _capture.Enabled = true;
            this.Hide();
            notifyIcon1.Visible = true;
        }

        private void saveBtn_Click(object sender, EventArgs e)
        {
            try
            {
                Properties.Settings.Default.TimeToLoadPage = Convert.ToInt32(cycleTimeTxtBx.Text);
                Properties.Settings.Default.Save();
            }
            catch (Exception error)
            {
                MessageBox.Show("Error: Unable to parse cycle timer. Please only use integers when setting the cycle time.", "Parsing Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cycleTimeTxtBx.Text = Properties.Settings.Default.TimeToLoadPage.ToString();
            }
        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Console.WriteLine("Clicked");
            Show();
            _capture.Enabled = false;
            this.WindowState = FormWindowState.Normal;
            notifyIcon1.Visible = false;
        }

    }
}
...