|
分類:[.NET 全般]
はじめまして、山崎といいます。
ゲーム等のDirectXを使用したアプリ等を含めたディスクトップ画面の静止画キャプチャを作りたいと思ってます。
VisualC#2008で作成したのですが、肝心のDirectXを使用したアプリがあると"D3DERR_INVALIDCALL"のエラーがでてしまいます。
通常アプリだけだと正常にキャプチャできています。
どのあたりを修正すればよいのか、或いは別な方法があれば教えて戴きたいです。よろしくお願いします。
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
private class GDI32
{
public const int SRCCOPY = 0x00CC0020;
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop);
}
private class User32
{
[DllImport("user32.dll")]
public static extern IntPtr GetDesktopWindow();
}
private void button1_Click(object sender, EventArgs e)
{
IntPtr hDesktopWind = User32.GetDesktopWindow();
PresentParameters param = new PresentParameters();
param.Windowed = true;
param.SwapEffect = SwapEffect.Copy;
param.PresentationInterval = PresentInterval.Immediate;
Device device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, hDesktopWind, CreateFlags.SoftwareVertexProcessing, param);
Surface sf = device.CreateOffscreenPlainSurface(device.DisplayMode.Width, device.DisplayMode.Height, Format.A8R8G8B8, Pool.SystemMemory);
device.GetFrontBufferData(0, sf); //エラーが起こる
Graphics g = sf.GetGraphics();
Bitmap captureBtm = new Bitmap(device.DisplayMode.Width, device.DisplayMode.Height, g);
Graphics gd = Graphics.FromImage(captureBtm);
IntPtr hdcS = g.GetHdc();
IntPtr hdcD = gd.GetHdc();
GDI32.BitBlt(hdcD, 0, 0, device.DisplayMode.Width, device.DisplayMode.Height,hdcS, 0, 0, GDI32.SRCCOPY);
gd.ReleaseHdc(hdcD);
g.ReleaseHdc(hdcS);
sf.ReleaseGraphics();
captureBtm.Save("D:\\test.bmp", ImageFormat.Bmp);
captureBtm.Dispose();
gd.Dispose();
g.Dispose();
sf.Dispose();
device.Dispose();
}
|