| ||||
■ 画面をキャプチャする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]
|