Как захватить экран с таймером с помощью C #? - PullRequest
1 голос
/ 12 июня 2009

Это приложение для Windows, использующее C #. Я хочу сделать снимок экрана с таймером. Таймер установлен на интервал 5000 мс. Когда таймер запущен, экран рабочего стола должен быть захвачен заголовком окна источника.

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 ]

6 голосов
/ 12 июня 2009

Таймер не срабатывает, потому что вы не обрабатываете тиковое событие. Пит также указал, что ваш файл будет перезаписываться при каждом тике.

Это должно выглядеть примерно так: Это не точный код, но он должен дать вам представление.

    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 голос
/ 03 февраля 2010

Я думаю, что утилита захвата экрана, которая поставляется с моим приложением BugTracker.NET с открытым исходным кодом, обладает нужной вам функциональностью или довольно близка к ней.

См. http://ifdefined.com/blog/post/Screen-capture-utility-in-C-NET.aspx о том, как выглядит утилита захвата экрана. Код для задержки выглядит следующим образом: главное окно сначала скрывается, а затем запускает саму себя, чтобы выполнить фактическую задержку и захват. Загрузите 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);
        }
    }
}
1 голос
/ 12 июня 2009

Вы запустили свой таймер, но ваша подпрограмма сохранения экрана, по-видимому, не содержится в вашем коде галочки таймера (если только вы не пропустили код из поста. Точно так же вы будете перезаписывать s.jpg каждый раз, и Я предполагаю, что это не то, что вам нужно. Использование условия while здесь также странно, потому что вам нужно только выполнить тест if.

0 голосов
/ 12 июня 2009

Также вы объявляете свой Таймер в попытке - так что если вы покинете эту область, ваш Таймер больше не будет существовать. И как он есть, ваш код будет пойман в ловушку в то время, и ваш графический интерфейс не сможет ничего делать. (Думаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...