トップ回答者
フォームの背面の画面をキャプチャできないでしょうか。

質問
回答
-
スクリーンキャプチャのために自身のフォームを隠す方法ですが、単純に Visible プロパティを false にしてからキャプチャするとフォーカスが移動した画面をキャプチャすることになります。今回のケースでは、これでは不適当かもしれません(button3_Clickメソッド)。さらに、Win32 APIを使うと、なぜか正常に動作しないことがあります(button2_Clickメソッド)。Windows 2000以上限定となりますが、Opacityプロパティを0にする方法で達成できましたが、その場合もApplication.DoEvents()メソッドが必要なようです(button1_Clickメソッド)。
private void button1_Click(object sender, EventArgs e)
{
// 安定 フォーカス正しい
double opacity = this.Opacity;
this.Opacity = 0;
Application.DoEvents(); // 必要
pictureBox1.Image = new ScreenCapture().CaptureScreen();
// http://www.developerfusion.co.uk/show/4630/
// あるいは
// SendKeys.SendWait("^{PRTSC}");
// pictureBox1.Image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
this.Opacity = opacity;
}
private void button2_Click(object sender, EventArgs e)
{
// 不安定 なぜかフォーカス正しい
bool saveVisible = this.Visible;
this.Visible = false;
Application.DoEvents(); // 効果なし
pictureBox1.Image = new ScreenCapture().CaptureScreen();
// http://www.developerfusion.co.uk/show/4630/
this.Visible = saveVisible;
}
private void button3_Click(object sender, EventArgs e)
{
// 不安定 さらにフォーカスが期待と異なる
bool saveVisible = this.Visible;
this.Visible = false;
SendKeys.SendWait("^{PRTSC}");
pictureBox1.Image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
this.Visible = saveVisible;
}
すべての返信
-
スクリーンキャプチャのために自身のフォームを隠す方法ですが、単純に Visible プロパティを false にしてからキャプチャするとフォーカスが移動した画面をキャプチャすることになります。今回のケースでは、これでは不適当かもしれません(button3_Clickメソッド)。さらに、Win32 APIを使うと、なぜか正常に動作しないことがあります(button2_Clickメソッド)。Windows 2000以上限定となりますが、Opacityプロパティを0にする方法で達成できましたが、その場合もApplication.DoEvents()メソッドが必要なようです(button1_Clickメソッド)。
private void button1_Click(object sender, EventArgs e)
{
// 安定 フォーカス正しい
double opacity = this.Opacity;
this.Opacity = 0;
Application.DoEvents(); // 必要
pictureBox1.Image = new ScreenCapture().CaptureScreen();
// http://www.developerfusion.co.uk/show/4630/
// あるいは
// SendKeys.SendWait("^{PRTSC}");
// pictureBox1.Image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
this.Opacity = opacity;
}
private void button2_Click(object sender, EventArgs e)
{
// 不安定 なぜかフォーカス正しい
bool saveVisible = this.Visible;
this.Visible = false;
Application.DoEvents(); // 効果なし
pictureBox1.Image = new ScreenCapture().CaptureScreen();
// http://www.developerfusion.co.uk/show/4630/
this.Visible = saveVisible;
}
private void button3_Click(object sender, EventArgs e)
{
// 不安定 さらにフォーカスが期待と異なる
bool saveVisible = this.Visible;
this.Visible = false;
SendKeys.SendWait("^{PRTSC}");
pictureBox1.Image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
this.Visible = saveVisible;
}