游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1680|回复: 3

关于程序失去焦点之后IDiretcInput8无法恢复的问题

[复制链接]

1

主题

5

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2009-3-10 15:07:00 | 显示全部楼层 |阅读模式
各位高手,小弟今日做了一个DirectX的程序,发现一旦程序失去焦点然后再次得到焦点时,键盘和鼠标都无法输入,我弄了好久,最好采取的办法是设置输入设备协调级别的时候采用BACKGROUND和NONEXCLUSIVE,然后设定一个bool类型的bActive检测程序是否获得焦点,如果失去焦点的话就Pause程序,但是这样做的话不能从根本上解决问题,我上网查了好久,网上说重新得到焦点之后需要调用IDirect3DDevice9::Reset(),然后把所有非POOL_DEFAULT的设备重新收回,但是小弟不知道具体该怎么做,希望各位高手指点一下,最好是有详细一点的代码或者伪代码,不尽感激! [em1] [em1] [em1]

11

主题

650

帖子

651

积分

高级会员

Rank: 4

积分
651
发表于 2009-3-10 15:44:00 | 显示全部楼层

Re:关于程序失去焦点之后IDiretcInput8无法恢复的问题

话说仙3当年就这样一切换就丢失设备,我还一直以为那是为了防止开金山游侠故意的

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2009-3-11 09:19:00 | 显示全部楼层

Re:关于程序失去焦点之后IDiretcInput8无法恢复的问题

是不是白板了?
那不是DINPUT的问题吧
DX9全屏模式一切换就会设备丢失,
你得把那些POOL_DEFAULT保存的全部release掉
然后全部再create
这个是我以前对这个问题写的记录

       Render();
     hr=g_pD3DDevice->TestCooperativeLevel();
     while(hr==D3DERR_DEVICELOST)
     {
     
  beforeResetVertex();
  if(hr!=D3DERR_DEVICENOTRESET)
  {
   Sleep(1000);
   hr=g_pD3DDevice->TestCooperativeLevel();
  }
  if(FAILED(g_pD3DDevice->Reset(&d3dpp)))
  {
   hr=D3DERR_DEVICELOST;
  }
  else
  {
   resetVertex();
       g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
  }
}
对于是模型资源创建类型是SYSTEMMEM等类型的,不需要去理会他,因为系统会自动在重置的时候自动将这些资源恢复,因此beforeResetVertex()和resetVertex()函数在程序全部使用SYSTEMMEM创建的时候可以为空。
然而对于那些不会自动恢复的资源这两个函数则不能为空,从SDK上面可以知道,必须把这些资源释放,在重置成功之后再RE CREATE,也就是重新建立,因此在对于这些资源,beforeResetVertex()就是直接释放,调用其Release方法,在resetVertex()函数之后则是跟初始化基本一致,把其中的数据重新创建一遍。由于设备丢失,光线等信息也会随之丢失,因此,在重置之后依旧需要对之进行重新设置。
对于default_pool(不会自动处理的类型)我那两个函数放的内容是这样的:
HRESULT beforeResetVertex()
{
if(g_pVertexBuffer != NULL) g_pVertexBuffer->Release();
return S_OK;
}
HRESULT resetVertex()
{
VOID* pVertices;
CUSTOMVERTEX cvVertices[]=
{
  //顶面
  {-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),},
  {-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0),},
  {5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
  {5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
  //侧面1
  {-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
  {-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),},
  {5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0),},
  {5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
  //侧面2
  {5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255),},
  {5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
  //侧面3
  {-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
  {-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0),},
  //侧面4
  {-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
  {-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255),},
  //底面
  {5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0),},
  {5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255),},
  {-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0),},
  {-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0),},
};
//创建顶点缓冲
if(FAILED(g_pD3DDevice->CreateVertexBuffer(
  18*sizeof(CUSTOMVERTEX),
  0,
  D3DFVF_CUSTOMVERTEX,
  D3DPOOL_DEFAULT,
  &g_pVertexBuffer,
  NULL
  )))
{
  return E_FAIL;
}
//得到顶点缓冲的指针,并锁住顶点缓冲
if(FAILED(g_pVertexBuffer->Lock(
  0,
  sizeof(cvVertices),
  &pVertices,
  0
  )))
{
  return E_FAIL;
}
//拷贝顶点值到顶点缓冲
memcpy(pVertices,cvVertices,sizeof(cvVertices));
//解锁顶点缓冲
g_pVertexBuffer->Unlock();
return S_OK;
}

先声明,这代码没有去考虑任何效率问题只考虑能够实现其结果,就是切换之后屏幕的东西依旧能够被渲染

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2009-3-11 09:28:00 | 显示全部楼层

Re:关于程序失去焦点之后IDiretcInput8无法恢复的问题

还有设备丢失处理之后DX9是需要恢复光照的
VS2003和VS2005可能在编译器那的原因,所以释放资源和reset()函数调用的顺序不一样
如果程序运作挂掉那就把两个函数的调用次序调一下,具体是什么样我就忘了,太久以前的事了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 03:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表