以下は、ウィンドウ内のキャンバスに四角形を描画し、任意のキーが押されたときに CopyFromScreen 関数を使用してアプリのスクリーン ショットを取得する単純なアプリのコードです。ただし、これが呼び出される直前に、canvas.Children.Clear() を呼び出します。結果の画像には長方形が含まれていないことが期待されますが、そうです。関数が呼び出されたときに実際の長方形の画像がキャンバスから削除されていないようですが、しばらくしてからです。
System.Threading.Thread.Sleep(1000); を入れてみました。Clear() 呼び出しの後ですが、四角形はその 1 秒間も画面に表示されたままになります。キーを押す関数が終了した後に明らかに削除されています.CopyFromScreen呼び出しの前に削除する方法はありますか?
これを実行するには、System.Drawing への参照を追加する必要があります。
XAML コード
<Window x:Class="CanvasTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="210" Height="240"
KeyDown="keyPressed">
<Window.Background>
<SolidColorBrush Color="White"/>
</Window.Background>
<Grid>
<Canvas Name="canvas"
HorizontalAlignment="Left" VerticalAlignment="Top">
</Canvas>
</Grid>
</Window>
.cs コード
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
namespace CanvasTest {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
Left = 0;
Top = 0;
Rectangle rect = new Rectangle {
Stroke = System.Windows.Media.Brushes.Black,
StrokeThickness = 1,
Width = 100,
Height = 100
};
canvas.Children.Add(rect);
Canvas.SetLeft(rect, 50);
Canvas.SetTop(rect, 50);
}
private void keyPressed(object sender, System.Windows.Input.KeyEventArgs e) {
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)Width, (int)Height);
System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap);
canvas.Children.Clear();
graphics.CopyFromScreen(0, 0, 0, 0,
new System.Drawing.Size(bitmap.Width, bitmap.Height),
System.Drawing.CopyPixelOperation.SourceCopy);
String path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
path += "\\MuckleEwesPic.png";
bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Png);
}
}
}
キャンバスをクリアしてから、この動作を起こさずにスクリーンショットを撮るにはどうすればよいですか? そして、「四角形を追加しないでください」は解決策ではありません。これは、問題が発生している大規模なアプリの最小限の例にすぎません。
ありがとう。