|
ありがとうございます。
以下のコードに書き直したところ、コンパイルが通りました。アクティブウィンドウの画面キャプチャにも成功しました。
using System;
using System.Runtime.InteropServices;
using System.Drawing;
namespace ScreenCapture
{
class ScreenCapture2013_5_30
{
[StructLayout(LayoutKind.Sequential)]//Sequentialレイアウトでは,構造体の要素が順番にメモリに配置される
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private const int SRCCOPY = 13369376;
[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr hDestDC,
int x,
int y,
int nWidth,
int nHeight,
IntPtr hSrcDC,
int xSrc,
int ySrc,
int dwRop);
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern int GetWindowRect(IntPtr hwnd,
ref RECT lpRect);
[DllImport("user32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hwnd);
[DllImport("user32.dll")]
private static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);
/// <summary>
/// アクティブなウィンドウの画像を取得する
/// </summary>
/// <returns>アクティブなウィンドウの画像</returns>
public static Bitmap CaptureActiveWindow()
{
//アクティブなウィンドウのデバイスコンテキストを取得
IntPtr hWnd = GetForegroundWindow();
IntPtr winDC = GetWindowDC(hWnd);//GetWindowDC:DCデバイスコンテキスト(内部状態)を取得するたびに、既定の属性をウィンドウのDCへ割り当てる
//ウィンドウの大きさを取得
RECT winRect = new RECT();
GetWindowRect(hWnd, ref winRect);
//Bitmapの作成
Bitmap bmp = new Bitmap(winRect.right - winRect.left,
winRect.bottom - winRect.top);
//Graphicsの作成
Graphics g = Graphics.FromImage(bmp);
//Graphicsのデバイスコンテキストを取得
IntPtr hDC = g.GetHdc();
//Bitmapに画像をコピーする
BitBlt(hDC, 0, 0, bmp.Width, bmp.Height,
winDC, 0, 0, SRCCOPY);
//解放
g.ReleaseHdc(hDC);
g.Dispose();
ReleaseDC(hWnd, winDC);
return bmp;
}
static void Main(string[] args)
{
//画像を作成する
Bitmap pic = CaptureActiveWindow();
//PNG形式で保存する
pic.Save("C:\\Users\\USER\\Downloads\\test.png", System.Drawing.Imaging.ImageFormat.Png);
//後片付け
pic.Dispose();
}
}
}
|