应用程序莫名其妙地无法捕获屏幕截图

时间:2018-05-31 20:01:05

标签: c# visual-studio-2012 screenshot

我有一个奇怪的问题,我一直试图确定一段时间。基本上我的应用程序使用chrome(来自数组的数据)打开各种URL,拍摄它们的照片,保存它们,并继续循环遍历数组。应用程序成功启动并运行,但可变地失败(通常在2-5天之间)。当它失败时,chrome似乎不再打开,但应用程序继续“运行”。以下是我的try / catches产生的错误:

  

at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX,Int32 sourceY,Int32 destinationX,Int32 destinationY,Size blockRegionSize,CopyPixelOperation copyPixelOperation)      at Command_Center_Screen_Capture_Agent.Form1.Capture(String name)

我现在唯一的工作理论是存储器可能存在问题,因为它未能拍照而无法打开浏览器,但我不确定如何测试该理论

{更新}通过我所有服务器上的日志,我注意到虽然只有一些上面有错误,但所有这些都有以下错误:

  

at System.Drawing.Image.Save(String filename,ImageCodecInfo encoder,EncoderParameters encoderParams)      在System.Drawing.Image.Save(String filename,ImageFormat格式)      在SERVER REDACTED \ Visual Studio 2012 \ Projects \ Command Center中的Command_Center_Screen_Capture_Agent.Form1.Capture(String name)屏幕捕获代理\ Command Center屏幕捕获代理\ 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;
        }

    }
}

0 个答案:

没有答案