如何从System.Timers.Timer

时间:2019-04-30 22:25:28

标签: c#

我正在尝试从应用程序中捕获屏幕快照,并在特定时间点满足特定条件时将其设置为picturebox.Image。这种情况必须反复检查。 为了检查这种情况,我使用了System.Timers.Timer。但是Clipboard.GetImage()无法正常工作。

我尝试了以下代码,但这没用。

timer = new System.Timers.Timer();
timer.Interval = 10000; //I'm checking the condition every 10 second or so
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true;
timer.Enabled = true;
void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
            if(myCondition==true)
               GetScreenshot();
}
void GetScreenshot()
{
            try
            {
                SendKeys.SendWait("{PRTSC}");
                Thread.Sleep(500);

                var image = Clipboard.GetImage();

                pictureBox1.Image = image;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
}

这不起作用,如果我尝试保存图像,则会出现Object reference not set类异常。

由于某个计时器是MTA,所以我已经读到它发生的地方,因此它无法访问剪贴板。我曾经尝试使用System.Windows.Forms.Timer,但是由于我猜想是连续检查,这会使程序变慢。

有什么简单的方法可以使它工作而不降低性能。 我是C#的新手,所以对某种解决方案的工作原理进行一些描述将非常有帮助。

1 个答案:

答案 0 :(得分:0)

Clipboard.GetImage返回存储在剪贴板中的图像。 剪贴板的存储有些复杂。可能同时出现不同类型的不同数据,因此应作为一个全新的话题进行讨论。

但是,您提到要获取屏幕截图。剪贴板本身不具有捕获屏幕的功能,除非特定的软件将屏幕截图放入剪贴板。例如, PrtScr 按钮可以做到这一点。

This link但是,如果您想自己捕获屏幕,可能会有帮助:

Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width,
                       Screen.PrimaryScreen.WorkingArea.Height,
                       PixelFormat.Format32bppArgb);

Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot);


gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.WorkingArea.X,
                        Screen.PrimaryScreen.WorkingArea.Y,
                        0,
                        0,
                        Screen.PrimaryScreen.WorkingArea.Size,
                        CopyPixelOperation.SourceCopy);

bmpScreenshot.Save("Screenshot.png", ImageFormat.Png);