如何使用C#使用计时器捕获屏幕?

时间:2009-06-12 12:16:08

标签: c# winforms

这是一个使用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;
    }

此代码无法正常运行。我怎样才能使它发挥作用?

4 个答案:

答案 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将无法执行任何其他操作。 (我想)。