这是一个使用C#的Windows应用程序。我想用计时器拍摄一个屏幕截图。定时器设置为5000 ms间隔。启动计时器后,应使用源窗口标题捕获桌面屏幕。
try
{
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Tick += new EventHandler(timer2_Tick);
timer.Interval = (100) * (50);
timer.Enabled = true;
timer.Start();
ScreenShots sc = new ScreenShots();
sc.pictureBox1.Image = system_serveillance.CaptureScreen.GetDesktopImage();
while(sc.pictureBox1.Image != null)
{
sc.pictureBox1.Image.Save("s"+".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
sc.pictureBox1.Image = null;
}
此代码无法正常运行。我怎样才能使它发挥作用?
答案 0 :(得分:6)
计时器未触发,因为您没有处理刻度事件。 Pete还指出你的文件将在每个刻度上被覆盖。
它需要看起来更像以下内容。这不是确切的代码,但它应该给你一个想法。
private Int32 pictureCount = 0;
public Form1()
{
timer1.Tick += new EventHandler(this.timer1_Tick);
timer1.Interval = (100) * (50);
timer1.Enabled = true;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
/* Screen capture logic here */
sc.pictureBox1.Image.Save(pictureCount.ToString() + ".jpg", ImageFormat.Jpeg);
pictureCount++;
}
答案 1 :(得分:1)
你已经启动了你的计时器,但你的屏幕保存程序似乎没有出现在你的计时器刻度代码中(除非你从帖子中省略了代码。同样,你每次都会覆盖s.jpg,并且我认为这不是你想要的。在这里使用while子句也很奇怪,因为你只需要执行if测试。
答案 2 :(得分:1)
我认为我的开源BugTracker.NET应用程序附带的屏幕捕获实用程序具有您正在寻找的功能,或者非常接近它。
有关屏幕捕获实用程序的外观,请参阅http://ifdefined.com/blog/post/Screen-capture-utility-in-C-NET.aspx。延迟的代码看起来像这样,主窗口首先隐藏自己,然后BeginInvoking自己进行实际的延迟和捕获。下载BugTracker.NET,您将获得屏幕捕获应用程序的完整资源。
void buttonCapture_Click(object sender, Exception e)
{
this.Hide();
BeginInvoke(new SimpleDelegate(CaptureForeground));
}
private void CaptureForeground()
{
// delay...
System.Threading.Thread.Sleep(500 + (1000 * (int)numericUpDownDelay.Value));
// Get foreground window rect using native calls
IntPtr hWnd = GetForegroundWindow();
RECT rct = new RECT();
GetWindowRect(hWnd, ref rct);
Rectangle r = new Rectangle();
r.Location = new Point(rct.Left, rct.Top);
r.Size = new Size(rct.Right - rct.Left, rct.Bottom - rct.Top);
CaptureBitmap(r);
this.Show();
}
private void CaptureBitmap(Rectangle r)
{
bitmap = new Bitmap(r.Width, r.Height);
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(r.Location, new Point(0, 0), r.Size);
}
}
}
答案 3 :(得分:0)
此外,您在尝试中声明了您的计时器 - 所以如果您离开该范围,您的计时器将不再存在。就目前而言,您的代码将陷入困境,您的GUI将无法执行任何其他操作。 (我想)。