游戏开发论坛

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

关于GetDeviceState()函数的问题

[复制链接]

5

主题

21

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2011-11-4 18:24:00 | 显示全部楼层 |阅读模式
这几天做键盘对象,发现一个问题。代码如下:
#include <dinput.h>
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"dinput8.lib")
LPDIRECTINPUTDEVICE8 pInputKB=NULL;
LPDIRECTINPUT8 pInput = NULL;
char strkeystate[256];
char strkeystateold[256];
HRESULT InitKeyBorad(HINSTANCE hinstance,HWND hwnd)
{
if (DI_OK != DirectInput8Create(hinstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(LPVOID*)&pInput,NULL))
{

return E_FAIL;
}

if(DI_OK != pInput->CreateDevice(GUID_SysKeyboard,&pInputKB,NULL))
{

return E_FAIL;
}
if(DI_OK != pInputKB->SetDataFormat(&c_dfDIKeyboard))
{
return E_FAIL;
}
pInputKB->SetCooperativeLevel(hwnd,DISCL_NONEXCLUSIVE|DISCL_FOREGROUND);
pInputKB->Acquire();
memset(strkeystate,0,sizeof(strkeystate));   
memset(strkeystateold,0,sizeof(strkeystateold));
return S_OK;
}
LRESULT Update()
{
memcpy(strkeystateold,strkeystate,sizeof(strkeystate));
if(DI_OK != pInputKB->GetDeviceState(sizeof(strkeystate),strkeystate))//这里一直失败
{
MessageBox(NULL,TEXT("a"),TEXT("a"),MB_OK);
memset(&strkeystate,0,sizeof(strkeystate));

}
return DI_OK;
}
问题出来了,GetDeviceState函数一直失败,我调试了半天,也不知道问题出在哪。
DIERR_INVALIDPARAM 第一次运行,返回的是这个。
求救。。。。。。。。
设备没有丢失。。

0

主题

27

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2011-11-5 11:59:00 | 显示全部楼层

Re:关于GetDeviceState()函数的问题

你把相应代码替换成下面的形式:
if( FAILED(mDevice->GetDeviceState(sizeof(mKeys), (LPVOID)mKeys)) )
        {
                if( FAILED(mDevice->Acquire()) ) return;
                if( FAILED(mDevice->GetDeviceState(sizeof(mKeys), (LPVOID)mKeys)) ) return;
        }
原因可能大致是这样,Keyboard独占会创建失败,就算独占也很有可能会使设备丢失,需要重新调用Acquire()函数,当然也有可能失败,这个由操作系统说了算。所以在这个循环里面不要出现诸如MessageBox之类的使线程停止的操作。

5

主题

21

帖子

82

积分

注册会员

Rank: 2

积分
82
 楼主| 发表于 2011-11-8 19:22:00 | 显示全部楼层

Re: Re:关于GetDeviceState()函数的问题

Luna: Re:关于GetDeviceState()函数的问题

你把相应代码替换成下面的形式:
if( FAILED(mDevice->GetDeviceState(sizeof(mKeys), (LPVOID)mKeys))...

成功了。谢谢

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2012-8-6 11:45:00 | 显示全部楼层

Re:关于GetDeviceState()函数的问题

如果
if( FAILED(mDevice->GetDeviceState(sizeof(mKeys), (LPVOID)mKeys)) )
{
if( FAILED(mDevice->Acquire()) ) return;
if( FAILED(mDevice->GetDeviceState(sizeof(mKeys), (LPVOID)mKeys)) ) return;
}
仍然失败呢?我最近也碰到这个问题,Update的时候出现的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-10 02:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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