2009-06-12 2 views
1

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

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

Что должен делать цикл «while»? –

+0

Вы можете быть немного более конкретным о том, что означает «не работает должным образом». – ChrisF

+0

В Visual Studio выберите текст «System.Windows.Forms.Timer» и нажмите клавишу F1. Узнайте о том, как использовать таймеры и как подключить к ним обработчик событий. Справка обычно содержит небольшой пример, который очень полезен. – NascarEd

ответ

6

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

он должен выглядеть больше как следующее. Это не точный код, но это должно дать вам идею.

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

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

+0

Я знаю, что теперь он работает правильно, можете ли вы сказать мне, как я могу это сделать? – ankush

+0

жаль, что он не работает должным образом. Я хочу захватить экран, поскольку время таймера завершено с временем захвата и заголовком окна. – ankush

0

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

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); 
     } 
    } 
} 
Смежные вопросы