DirectInputDevice8 :: Acquire返回E_ACCESSDENIED

当我设置如下的合作级别时Acquire()返回E_ACCESSDENIED,但是如果我跳过合作级别,它可以正常工作。怎么了? 

  
if(FAILED(hr = g_pKeyboard-> SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
{
	返回小时;
}

if(FAILED(hr = g_pKeyboard-> Acquire()))
{
	返回小时;
}
  

____________________________________________________________没有什么不存在。可以?

 

它与DISCL_BACKGROUND一起工作正常,为什么不DISCL_FOREGROUND?

 

 
也许当你试图获取设备时你的应用程序就在后台,所以它会失败,因为它无法获得你的应用程序关注的设备。我肯定不知道,你可以发布一些代码,初始化caode就是这样。 

另一个注意事项为什么你不要删除if(FAILED(检查Acquire方法。当你使用函数GetDeviceState(...)并且失败时那样)然后你可以进入循环直到获得设备或某物
 
 
//-------------------------------
如果在窗口设置为可见之前创建直接输入,则可能会发生这种情况。(即在ShowWindow()调用之前)我不确定应用程序是否在前景中,直到它可见,但如果不是这样的话,其他人可能会澄清这一点。

你在任务栏中运行了什么会导致你的应用程序移动到后台吗?您是否正在运行可能导致此问题的分析器?病毒扫描器?IM申请?

在任何情况下,只要所有错误都是您没有获得键盘,您可以在GetDeviceState或GetDeviceData中处理,如上所述。你应该在这里处理它,不管这是好的做法。

我继续并在我的代码中更改了(FAILED())检查。每个DirectInput调用现在将结果传递给''hr'',我根据MSDN函数规范测试所有已知的返回值,并记录日志文件的细节。当DirectInput开始失败时,它有助于获取此信息。

Kressilac 
ps旁注。如果绝对必须捕获每个按键,请使用GetDeviceData而不是GetDeviceState。GetDeviceState很有可能丢失密钥。
 
//-----------------------------------------------------------------------------------------------
我的代码使用DISCL_FOREGROUND和DISCL_NONEXCLUSIVE,但在调用Acquire()之前它调用了SetDataFormat(&c_dfDIKeyboard)。你需要这样做。c_dfDIKeyboard由DirectX定义,所以只需键入verbatim(“g_pKeyboard-> SetDataFormat(&c_dfDIKeyboard)”),它应该可以工作。该调用介于SetCooperativeLevel和Acquire之间。
 

posted on 2019-05-17 15:29  guanxi0808  阅读(402)  评论(0编辑  收藏  举报

导航