| ||||
■ 画面をキャプチャするC#で画面キャプチャを行うにはSendKeys.SendWaitが便利だ。SendKeys.SendWaitはアプリケーションにキーストロークを送信し、そのプロセスが開始されるまで待機する。もちろん、Ctrl + PrtScのようなキーストロークの組み合わせも送信可能なので、これを利用して画面キャプチャを行う。 キャプチャしたデータはCtrl + PrtScキーを押下したのと同様にクリップボードに保存される。アプリケーションではクリップボード内のデータをチェックし、ビットマップに変換する。
SendKeys.SendWait("^{PRTSC}"); // 画面キャプチャ
IDataObject data = Clipboard.GetDataObject(); // クリップボードからキャプチャしたデータを取り出す
// 取り出したデータをビットマップに変換
if(data.GetDataPresent(DataFormats.Bitmap))
{
bitmap = (Bitmap)data.GetData(DataFormats.Bitmap);
}
キーストロークによる画面キャプチャを採用できないときはAPIによる方法もある。以下は全画面のキャプチャを行う例である。GetDesktopWindowでデスクトップのハンドルを取得し、転送先のBitmapオブジェクトともにGraphicsオブジェクトを介してデバイスコンテキストハンドルを取得する。あとはBitBltでこのデバイスコンテキスト間でビットマップを転送する。
[DllImport("gdi32.dll")]
extern static bool BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,uint dwRop);
[DllImport("user32.dll")]
extern static IntPtr GetDesktopWindow();
const int SRCCOPY = 0x00CC0020;
// 途中省略
// APIでキャプチャ
public void ScreenCaptureWithApi() {
Rectangle r = Screen.PrimaryScreen.Bounds;
// Rectangle r = SystemInformation.VirtualScreen;
IntPtr h = GetDesktopWindow();
Graphics g1 = Graphics.FromHwnd(h);
IntPtr hdc1 = g1.GetHdc(); // デスクトップのデバイスコンテキストハンドル
bitmap = new Bitmap(r.Width,r.Height);
Graphics g2 = Graphics.FromImage(bitmap);
IntPtr hdc2 = g2.GetHdc(); // Bitmapのデバイスコンテキストハンドル
// BitBlt
BitBlt(hdc2,0,0,r.Width,r.Height,hdc1,0,0,SRCCOPY);
g2.ReleaseHdc(hdc2);
g1.ReleaseHdc(hdc1);
}
"画面をキャプチャする"のサンプル (2005/07/12)
Copyright(C) 2004-2012 モバイル開発系(K) All rights reserved.
[Home]
|