游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5699|回复: 10

困扰了我很久的问题…(DInput)

[复制链接]

20

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 2004-11-1 21:51:00 | 显示全部楼层 |阅读模式
我的程序出了问题
以下是简化版的程序代码
但也说不出是那里出了毛病
有人可以告诉我到底哪里出了错?

#include "dinput.h"
#include "windows.h"

#define KEYDOWN( name, key ) ( name[ key ] & 0x80)

HWND g_hWnd = 0;
HINSTANCE g_hInstance = 0;

IDirectInput8                *g_pDInputInterface;                //dinput interface
IDirectInputDevice8 *g_pKeyboardDevice;                        //keyboard device

unsigned char *g_auchKeyboardState = new unsigned char[ 256 ];

LRESULT CALLBACK Wnd_Proc( HWND hWnd_, unsigned int uiMsg_, WPARAM wParam_, LPARAM lParam_ )
{
        switch ( uiMsg_ )
        {
        case WM_DESTROY:
                {
                        PostQuitMessage( 0 );
                       
                        break;
                }

        case WM_ACTIVATE:
                {
                        if ( 0 != g_pKeyboardDevice )
                        {
                                g_pKeyboardDevice->Acquire();
                        }
                        break;
                }

    case WM_PAINT:
                {
                        ValidateRect( hWnd_, NULL );
                        break;
                }
        }
        return DefWindowProc( hWnd_, uiMsg_, wParam_, lParam_ );
}

void CheckKeyboard( void )
{
        ZeroMemory( g_auchKeyboardState, sizeof( unsigned char [ 256 ] ) );

        long lResult = g_pKeyboardDevice->GetDeviceState( sizeof( g_auchKeyboardState ),
                ( void * ) &g_auchKeyboardState );

        if ( FAILED( lResult ) )
        {
                lResult = g_pKeyboardDevice->Acquire( );

                while ( DIERR_INPUTLOST == lResult )
                {
                        lResult = g_pKeyboardDevice->Acquire( );
                }

                if ( DIERR_OTHERAPPHASPRIO == lResult || DIERR_NOTACQUIRED == lResult )
                {
                        return;
                }
        }

    for( int i = 0; i < 256; i++ )
    {
        if( g_auchKeyboardState & 0x80 )
        {
                         PostQuitMessage( 0 );
        }
    }
}

int WINAPI WinMain( HINSTANCE hInstance_, HINSTANCE hPrevInstance_,
                                   char* szCmdLine_, int iShowCmd_ )
{
        //register the class with default value
        WNDCLASS WndClass = { 0, Wnd_Proc, 0, 0, hInstance_,
                0, 0, ( HBRUSH )GetStockObject( BLACK_BRUSH ), NULL, "Netmez! DInput" };
       
        RegisterClass( &WndClass );

        //adjust window size
        RECT WinRectStruct;
        SetRect( &WinRectStruct, 0, 0, 400, 300 );
        AdjustWindowRect( &WinRectStruct, WS_OVERLAPPEDWINDOW, false );

        //create window
        g_hWnd = CreateWindow( "Netmez! DInput", "DInput", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
                CW_USEDEFAULT, 400, 300, 0, 0, g_hInstance, 0 );

        ShowWindow( g_hWnd, true );
        UpdateWindow( g_hWnd );

        if ( 0 != g_pDInputInterface )
        {
                return 0;
        }

        DirectInput8Create( hInstance_, DIRECTINPUT_VERSION, IID_IDirectInput8,
                ( void** ) &g_pDInputInterface, 0 );

        //if dinput interface is still 0, that means dinput create failed,
        //so post error message and quit
        if ( 0 == g_pDInputInterface )
        {
                PostQuitMessage( 0 );
        }

        g_pDInputInterface->CreateDevice( GUID_SysKeyboard, &g_pKeyboardDevice, 0 );

        //if keyboard device is 0, that means device create failed,
        //so post error message and quit
        if ( 0 == g_pKeyboardDevice )
        {
                PostQuitMessage( 0 );
        }

        //set up keyboard device
        g_pKeyboardDevice->SetDataFormat( &c_dfDIKeyboard );
        g_pKeyboardDevice->SetCooperativeLevel( g_hWnd, DISCL_BACKGROUND| DISCL_NONEXCLUSIVE );
        g_pKeyboardDevice->Acquire( );

        for ( MSG MsgStruct ; ; )
        {
                //if there is a message
                if ( 0 != PeekMessage( &MsgStruct, 0, 0, 0, PM_REMOVE ) )
                {
                        //if user request quit
                        if ( WM_QUIT == MsgStruct.message )
                        {
                                PostQuitMessage( 0 );
                                break;
                        }
                        TranslateMessage( &MsgStruct );
                        DispatchMessage( &MsgStruct );
                }
                else
                {       
                        CheckKeyboard( );
                }
        }
       
        UnregisterClass( "Netmez! DInput", hInstance_ );
        delete [ ] g_auchKeyboardState;

        //if the keyboard device not 0, that means device has been initialize,
        //so unacquire and release device
        if ( 0 != g_pKeyboardDevice )
        {
                g_pKeyboardDevice->Unacquire( );
                g_pKeyboardDevice->Release( );
        }

        //if the dinput interface not 0, that means interface has initialize,
        //so release the interface
        if ( 0 != g_pDInputInterface )
        {
                g_pDInputInterface->Release( );
        }

        return 0;
}
[em7]

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-1 22:06:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

有什么症状吗?

20

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
 楼主| 发表于 2004-11-1 22:39:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

有…
    for( int i = 0; i < 256; i++ )
    {
        if( g_auchKeyboardState & 0x80 )
        {
  PostQuitMessage( 0 );
        }
    }
预期当使用者按下键盘上任何键,都会执行以上程序代码中的” PostQuitMessage( 0 );”而跳开循环,结束程序

可是,无论我按下任何键,程序也没有结束…

3

主题

95

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2004-11-2 01:25:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

建议还是多看看DInput的示例吧,我觉得DX的所有组件中,也就属DInput最好用最简单最容易使用了。。。。。。。

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2004-11-2 08:32:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

long lResult = g_pKeyboardDevice->GetDeviceState( sizeof( g_auchKeyboardState ),
( void * ) &g_auchKeyboardState );

感觉这句有问题, 参数g_auchKeyboardState已经是指针了,你还用&?然后还用( void* )来强制转换!?
你不要那个&符号!直接填写( void* )g_auchKeyboardState 看看,
或者如果那里需要的是void **,
你就写( void**) &g_auchKeyboardState

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-2 11:44:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

如果编译器没有报错的话应该不是指针的问题
else
{
CheckKeyboard( );
}
试试把else去掉看看

20

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
 楼主| 发表于 2004-11-2 12:11:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

试过了,也没有用…

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-2 12:31:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

单步运行一下看看程序到底在哪里出了问题

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-2 12:55:00 | 显示全部楼层

Re: 困扰了我很久的问题…(DInput)

靠,,sizeof(g_auchKeyboardState)是 4
晕死,,,,,,,,,,,,,,,,,

[em7] [em7] [em7] [em7] [em7] [em7]
[em7] [em7] [em7] [em7] [em7] [em7]

此等问题

20

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
 楼主| 发表于 2004-11-2 19:50:00 | 显示全部楼层

Re:困扰了我很久的问题…(DInput)

唉,也不知道是什么原因
大问题通常很快解决
但是这些「小」问题却经常困扰我几天 +_+
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 02:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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