C++ での作業に成功しましPrintWindow
たが、C# で作業しようとすると、null データのビットマップが返されます。.NET 4.0 で VS 2012 Pro を使用。これが私のコードです:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);
[DllImport("user32.dll")]
public static extern ushort getLastError();
static int count = 0;
public Bitmap getWindow(IntPtr windowHandle)
{
RECT rect;
Window.GetWindowRect(windowHandle, out rect);
Console.WriteLine(rect.X);
Console.WriteLine(rect.Y);
Console.WriteLine(rect.Width);
Console.WriteLine(rect.Height);
Console.WriteLine();
Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
bool success = PrintWindow(windowHandle, hdcBitmap, 0);
if (!success)
{
Console.WriteLine("Error copying image");
Console.WriteLine(getLastError());
}
bmp.Save("image_" + count++ + ".bmp");
gfxBmp.ReleaseHdc(hdcBitmap);
gfxBmp.Dispose();
return bmp;
}
出力は次のとおりです。
182
182
664
533
エラー メッセージは表示されず、RECT 境界が正しいため、ハンドルが有効であるように見えます。この例に従って、電卓プログラムを使用して C++ で動作するようにしましたが、電卓を使用した同じコードは C# では動作しません。
C#で動作するために必要です。