2017-07-17 4 views
0
void CaptureTimer_Tick(object sender, EventArgs e) 
    { 
     CaptureTimer.Stop(); 
     Bitmap bitmapImage = new Bitmap((int)this.ActualWidth, (int)this.ActualHeight); 
     Graphics gr1 = Graphics.FromImage(bitmapImage); 
     IntPtr dc1 = gr1.GetHdc(); 
     IntPtr dc2 = NativeMethods.GetWindowDC(NativeMethods.GetForegroundWindow()); 
     NativeMethods.BitBlt(dc1, (int)20, (int)20, (int)this.ActualWidth, (int)this.ActualHeight, dc2, 20, 20, 13369376); 
     gr1.ReleaseHdc(dc1); 
     Random rnd = new Random(); 
     bitmapImage.Save(string.Format(".\\Captures\\Capture{0}.jpg", rnd.Next().ToString()), ImageFormat.Jpeg); 

     PlaySoundOnButton(ButtonTypes.CaptureBtn); 
     CommandManager.InvalidateRequerySuggested(); 
    } 

crash2013 VS C#のプログラムをクラッシュするコードの一部であり、直接ストリーム

からビットマップを保存します。 またはコード全体を入れる必要がありますか? 今回は皆さんのおかげで申し訳ありません。

+3

@juharr @SLaksを@mjwills。あなたの質問にコードと実際のエラーメッセージを入れてください。 – SLaks

+0

スクリーンショットを投稿するのではなく、コードをコピーして貼り付けるのがはるかに便利です。 – juharr

+0

例外は複雑なオブジェクトですが、内部例外がある可能性があります。スクリーンショットにアクションリンク「例外の詳細をクリップボードにコピーする」があります。ときどきこの情報は非常に役立ちます –

答えて

0

あなたのコードを持ついくつかの注意点があります:それはあなたのために行われるように

A)あなたは)あなたの変数の一部にDisposeを呼び出す(またはusingを使用していません。 bitmapImageはこのような例の1つです。

b)ファイルを保存するために "。\ Captures ..."を使用すると、Current Directoryに依存しているため、問題があります。これは、現在のディレクトリがWindowsディレクトリ(プログラムにファイルの書き込み権限がないなど)に変更された場合に問題になる可能性があります。

c)Random rnd = new Random();は、同じファイル名が複数回生成される(特に連続して呼び出された場合)ことがあります。古いスクリーンショットが失われたり上書きされたりする可能性があります。私に助言のための

0
{ 
     string path = @"f:\temp\MyTest.tif"; 
     FileStream fs = new FileStream(path, FileMode.Create); 
     RenderTargetBitmap bmp = new RenderTargetBitmap((int)workspace.ActualWidth, 
      (int)workspace.ActualHeight, 1/96, 1/96, PixelFormats.Pbgra32); 
     bmp.Render(workspace); 
     BitmapEncoder encoder = new TiffBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(bmp)); 
     encoder.Save(fs); 
     fs.Close(); 
    } 

おかげで、エラーメッセージではありません@Aleksアンドレーエフ

関連する問題