我正在尝试从应用程序中捕获屏幕快照,并在特定时间点满足特定条件时将其设置为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#的新手,所以对某种解决方案的工作原理进行一些描述将非常有帮助。
答案 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);