游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2987|回复: 8

请教个DirectInput的问题

[复制链接]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-7-4 10:43:00 | 显示全部楼层 |阅读模式
我做DInput时遇到困难了,初始化没出错,但不知漏了些什么了,这些是全部的DInput代码:
LPDIRECTINPUT8            pInput          = NULL;
LPDIRECTINPUTDEVICE8      pInputDev       = NULL;
...............
void InitInput()//初始化
{
            HRESULT hr;

        hr=DirectInput8Create(GetModuleHandle(NULL),
                DIRECTINPUT_VERSION,
                IID_IDirectInput8,
                (void**)&pInput,
                NULL);
        hr=pInput->CreateDevice(GUID_SysMouse, &pInputDev, NULL);
        hr=pInputDev->SetDataFormat(&c_dfDIMouse);
        hr=pInputDev->SetCooperativeLevel(hWnd,DISCL_EXCLUSIVE | DISCL_FOREGROUND);
        DIPROPDWORD dipdw;

        dipdw.diph.dwSize       = sizeof(DIPROPDWORD);
    dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
        dipdw.diph.dwObj        = 0;
    dipdw.diph.dwHow        = DIPH_DEVICE;
    dipdw.dwData            = 500;

    pInputDev->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph ) ;
        pInputDev->Acquire();
}

void ReadMouse()//检测鼠标
{
        DIMOUSESTATE mouse_stat;
        ZeroMemory(&mouse_stat,sizeof(mouse_stat));
        HRESULT hr;
        hr=pInputDev->GetDeviceState( sizeof(DIMOUSESTATE), &mouse_stat );
        mousex+=mouse_stat.lX;
        mousey+=mouse_stat.lY;
}
[em24]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-7-5 22:24:00 | 显示全部楼层

Re:请教个DirectInput的问题

up

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-7-8 09:47:00 | 显示全部楼层

Re:请教个DirectInput的问题

up

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-8 10:54:00 | 显示全部楼层

Re:请教个DirectInput的问题

你也不说问题,拿东西考人啊

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-7-8 22:38:00 | 显示全部楼层

Re:请教个DirectInput的问题

这样的初始化的hr全部正常,但:hr=pInputDev->GetDeviceState( sizeof(DIMOUSESTATE), &mouse_stat );
就出错了:)

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-11 10:29:00 | 显示全部楼层

Re:请教个DirectInput的问题

你真是问一句说一句,那地方出错很正常,不是所有的情况下都是返回S_OK的,你要把你遇到的问题讲明白

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-11 10:33:00 | 显示全部楼层

Re:请教个DirectInput的问题

If the method succeeds, the return value is DI_OK.

If the method fails, the return value can be one of the following error values:


DIERR_INPUTLOST Access to the input device has been lost. It must be reacquired.

DIERR_INVALIDPARAM An invalid parameter was passed to the returning function, or the object was not in a state that permitted the function to be called. This value is equal to the E_INVALIDARG standard Component Object Model (COM) return value.

DIERR_NOTACQUIRED The operation cannot be performed unless the device is acquired.

DIERR_NOTINITIALIZED The object has not been initialized.

E_PENDING Data is not yet available.

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-11 10:43:00 | 显示全部楼层

Re:请教个DirectInput的问题

其中 DIERR_INPUTLOST 和 DIERR_NOTACQUIRED 应该是属于正常的错误,前者表示设备丢失了重新调用一下Acquire()就可以了,后者有可能你的循环取状态值的函数调用了,但你的Acquire()函数还没来的及调用,等一下就好了。

要特别注意的是第一种情况,如果你在DISCL_FOREGROUND状态下调试程序,设了断点的话,通常运行到断点的时候返回的是 DIERR_INPUTLOST ,因为这时候你的程序实际上切换到后台去了,需要在窗口即获得时重新Acquire()。

偷懒的做法就是
hr=pInputDev->GetDeviceState( sizeof(DIMOUSESTATE), &mouse_stat );
if ( FAILED(hr) ) pInputDev->Acquire( );

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-7-11 10:59:00 | 显示全部楼层

Re:请教个DirectInput的问题

那我上面的代码齐全了吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-26 08:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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