2009-06-12 4 views
1

これはC#を使用したWindowsアプリケーションです。タイマーでスクリーンショットを撮りたいタイマーは5000ms間隔に設定されています。タイマーが開始されると、ソースウィンドウのキャプションを使用してデスクトップ画面をキャプチャする必要があります。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を上書きします。

+0

今は正しく動作していることは分かっていますが、どうすればいいのですか? – ankush

+0

申し訳ありませんが正常に動作していません。 キャプチャ時間とウィンドウのキャプションでタイマーの時間が完了したので、私は画面をキャプチャしたいです。 – ankush

0

また、try内にTimerを宣言しています。そのスコープを離れると、Timerは存在しなくなります。そして、それが現れれば、あなたのコードはしばらくトラップされ、あなたのGUIは何もすることができなくなります。 (おもう)。

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); 
     } 
    } 
} 
関連する問題