新手求教各位大神 Directx全屏抓图 问题

念生 2015-04-24 06:11:35
想使用 Directx抓取全屏的war3游戏的画面,主要程序如下:
现在情况是游戏不为全屏的时候可以抓到,但是游戏一旦全屏就只能抓到游戏后面的桌面上的图像了。求教各位大神为什么会这样?

注释可以忽略。。都是随便写的


//函数前面的GET_IMAGE_DirectX::一定要写,否则会有编译错误
HRESULT GET_IMAGE_DirectX::Get_Image_DirectX_InitD3D(HWND hwnd)
{

/****************** 进行DirectX初始化定义 ****************************/
//定义函数参数
HWND hWnd = hwnd;


//定义
D3DDISPLAYMODE ddm;
D3DPRESENT_PARAMETERS d3dpp;


//定义 这三个变量之前在.h文件中定义的时候下面总是说未定义标识符。。。
//是为什么呢???????????????
CRect gScreenRect;
gScreenRect = CRect(0, 0, 0, 0);

int nDisplayWidth = 0;
int nDisplayHeight = 0;


//声明 灵活的运用声明使程序看起来更有条理
extern IDirect3D9* g_pD3D;
extern IDirect3DDevice9* g_pd3dDevice;
extern IDirect3DSurface9* g_pSurface;


if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
{
MessageBox(NULL, "Unable to Create Direct3D ", "提示", MB_OK);
return E_FAIL;

}

if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &ddm)))
{
MessageBox(NULL, "Unable to Get Adapter Display Mode", "提示", MB_OK);
return E_FAIL;
}

SecureZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));

d3dpp.Windowed =TRUE;// WINDOW_MODE之前用的。。卡死了 全屏模式对应FALSE,试了几次FALSE,是将hWnd对应的窗口全屏化,但是如果游戏本身已经全屏化了那就卡死了。。不知道为什么



d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; //
d3dpp.BackBufferFormat = ddm.Format;//换成D3DFMT_UNKNOWN 后还是一样。。。

//....无论我设置ddm.Height是多少都没用。。。为什么呢????
d3dpp.BackBufferHeight = nDisplayHeight = gScreenRect.bottom = ddm.Height;//
d3dpp.BackBufferWidth = nDisplayWidth = gScreenRect.right =ddm.Width;//

d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;//
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//
d3dpp.hDeviceWindow = hWnd; //这个地方应该是对的
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//D3DPRESENT_INTERVAL_IMMEDIATE D3DPRESENT_INTERVAL_DEFAULT
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;// D3DPRESENT_RATE_DEFAULT 试了下ddm.RefreshRate,不行说无法CreateDevice



if (FAILED(g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd, //hWnd 。NULL。原来是hWnd换成了NULL,还是可以得。。为什么呢???
D3DCREATE_SOFTWARE_VERTEXPROCESSING , //试过D3DCREATE_MIXED_VERTEXPROCESSING 。。。效果一样
&d3dpp,
&g_pd3dDevice)))
{
MessageBox(NULL, "Unable to Create Device ", "提示", MB_OK);
return E_FAIL;

}






//g_pd3dDevice->CreateImageSurface(ScreenWidth, ScreenHeight,D3DFMT_A8R8G8B8, &pSurface); //与下面的CreateOffscreenPlainSurface类似的
if (FAILED(g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_pSurface, NULL)))
{
MessageBox(NULL, "Unable to Create Surface", "提示", MB_OK);
return E_FAIL;

}

return S_OK;
}









//抓取游戏图片
void GET_IMAGE_DirectX::Get_Image_DirectX_Save(HWND hwnd,char FileName[512])
{

//判断InitD3D是否成功已经交给调用Get_Image_DirectX_InitD3D的地方来处理了,不在这

//定义函数参数
char szFileName[512] = {0};

strcpy_s(szFileName, FileName);

//声明 灵活的运用声明使程序看起来更有条理
extern IDirect3D9* g_pD3D;
extern IDirect3DDevice9* g_pd3dDevice;
extern IDirect3DSurface9* g_pSurface;

//SetCursor(LoadCursor(NULL, IDC_WAIT)); //将鼠标设置为等待
g_pd3dDevice->GetFrontBufferData(0, g_pSurface);


//看来这个句柄是管用的。。。
HWND hWnd = hwnd;
RECT rtCapture;
::GetWindowRect(hWnd, &rtCapture);


D3DXSaveSurfaceToFile((LPCSTR)szFileName, D3DXIFF_BMP, g_pSurface, NULL, &rtCapture); //Save to File
//如果&rtCapture改为NULL就是全屏抓图,使用&rtCapture就限定了抓的窗口


//g_pSurface->Release(); //完成之后释放指针
g_pd3dDevice->Release();
g_pD3D->Release();



//此主要是释放Direct3D资源,因为不管Direct3D对象还是Direct3D设备对象都是COM对象,所以,在此必须调用Release方法,使COM对象的引用计数-1。并且,必须先释放Direct3D设备对象,再释放Direct3D对象(因为Direct3D设备对象是通过Direct3D对象创建的)。



}
...全文
635 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
归途醉染 2017-12-27
  • 打赏
  • 举报
回复
顶啊 没有大佬解答吗?
念生 2015-04-30
  • 打赏
  • 举报
回复
自顶。。。。。。。。。。。。
robertzh123 2015-04-27
  • 打赏
  • 举报
回复
war3也是derectdraw的吧,好像不能相互抓图;
念生 2015-04-27
  • 打赏
  • 举报
回复
war3是derectdraw的,为什么全屏的时候就不能抓了

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧