Example #1
0
void AppState::initInputDevices() {
    //创建DirectInput8对象
    IDirectInput8A* direct_input;
    dx::throwIfFailed(
        DirectInput8Create(
            hInstance_,
            DIRECTINPUT_VERSION,
            IID_IDirectInput8,
            (void **) &direct_input,
            nullptr)
    );
    direct_input_.reset(direct_input);


    //创建DirectInput8设备(键盘)
    IDirectInputDevice8A* keyboard_device;
    dx::throwIfFailed(
        direct_input_->CreateDevice(GUID_SysKeyboard, &keyboard_device, nullptr)
    );
    keyboard_device_.reset(keyboard_device);


    //为键盘设置格式
    dx::throwIfFailed(
        keyboard_device_->SetDataFormat(&c_dfDIKeyboard)
    );


    //为键盘设置行为
    dx::throwIfFailed(
        keyboard_device_->SetCooperativeLevel(windowHwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)
    );

    //为键盘设置缓冲方式
    DIPROPDWORD dipdw;
    dipdw.diph.dwSize = sizeof(DIPROPDWORD);
    dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    dipdw.diph.dwObj = 0;
    dipdw.diph.dwHow = DIPH_DEVICE;
    dipdw.dwData = kKeyInputBufferSize; // Arbitary buffer size

    dx::throwIfFailed(
        keyboard_device_->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph)
    );

    //创建事件,为自动型(使用完自动置为无信号状态),初始化为无信号状态
    HANDLE handle = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!handle) {
        throw std::runtime_error("CreateEvent keyboard error!");
    }

    //为键盘安装事件通知关联,并准备获取采集
    keyboard_device_->SetEventNotification(handle);
    keyboard_device_->Acquire();

    //添加等待对象,以及触发事件
    addEventHandle(handle, std::bind(&AppState::updateKeyInputState, this));

    //创建DirectInput8设备(鼠标)
    IDirectInputDevice8A* mouse_device;
    dx::throwIfFailed(
        direct_input_->CreateDevice(GUID_SysMouse, &mouse_device, NULL)
    );
    mouse_device_.reset(mouse_device);


    //为鼠标设置格式(8按键鼠标)
    dx::throwIfFailed(
        mouse_device_->SetDataFormat(&c_dfDIMouse2)
    );


    //为鼠标设置行为
    dx::throwIfFailed(
        mouse_device_->SetCooperativeLevel(windowHwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)
    );


    //鼠标设置缓冲方式
    dipdw.diph.dwSize = sizeof(DIPROPDWORD);
    dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    dipdw.diph.dwObj = 0;
    dipdw.diph.dwHow = DIPH_DEVICE;
    dipdw.dwData = kMouseInputBufferSize;

    dx::throwIfFailed(
        mouse_device_->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph)
    );

    handle = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!handle) {
        throw std::runtime_error("CreateEvent mouse error!");
    }

    mouse_device_->SetEventNotification(handle);
    mouse_device_->Acquire();

    addEventHandle(handle, std::bind(&AppState::updateMouseInputState, this));

    /*
     _pD3D = Direct3DCreate9(D3D_SDK_VERSION);
     if(_pD3D == nullptr)
     {
     BOOST_THROW_EXCEPTION(std::runtime_error("Direct3DCreate9 error!"));
     }

     D3DPRESENT_PARAMETERS d3dpp;
     ZeroMemory( &d3dpp, sizeof( d3dpp ) );
     d3dpp.Windowed = TRUE; //不是全屏
     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

     hr = _pD3D->CreateDevice(
     D3DADAPTER_DEFAULT,
     D3DDEVTYPE_HAL,
     WindowHwnd,
     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
     &d3dpp,
     &_pd3dDevice);

     if (FAILED(hr)) {
     BOOST_THROW_EXCEPTION(std::runtime_error("CreateDevice IDirect3DDevice9 error!"));
     }

     IDirect3DSurface8* lpDSCursor;
     hr = _pd3dDevice->CreateImageSurface(32, 32, D3DFMT_A8R8G8B8,&lpDSCursor);
     */

}