bool DIDevice::Open() { m_sName = ConvertACPToUTF8( JoystickInst.tszProductName ); LOG->Trace( "Opening device '%s'", m_sName.c_str() ); buffered = true; LPDIRECTINPUTDEVICE8 tmpdevice; // load joystick HRESULT hr = g_dinput->CreateDevice( JoystickInst.guidInstance, &tmpdevice, nullptr ); if ( hr != DI_OK ) { LOG->Info( hr_format(hr, "OpenDevice: IDirectInput_CreateDevice") ); return false; } hr = tmpdevice->QueryInterface( IID_IDirectInputDevice8, (LPVOID *) &Device ); tmpdevice->Release(); if ( hr != DI_OK ) { LOG->Info( hr_format(hr, "OpenDevice(%s): IDirectInputDevice::QueryInterface", m_sName.c_str()) ); return false; } int coop = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; if( type == KEYBOARD ) coop = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND; hr = Device->SetCooperativeLevel( GraphicsWindow::GetHwnd(), coop ); if ( hr != DI_OK ) { LOG->Info( hr_format(hr, "OpenDevice(%s): IDirectInputDevice2::SetCooperativeLevel", m_sName.c_str()) ); return false; } switch(type) { case KEYBOARD: hr = Device->SetDataFormat( &c_dfDIKeyboard ); break; case JOYSTICK: hr = Device->SetDataFormat( &c_dfDIJoystick ); break; case MOUSE: hr = Device->SetDataFormat( &c_dfDIMouse ); break; } if ( hr != DI_OK ) { LOG->Info( hr_format(hr, "OpenDevice(%s): IDirectInputDevice2::SetDataFormat", m_sName.c_str()) ); return false; } switch( type ) { case JOYSTICK: Device->EnumObjects( DIJoystick_EnumDevObjectsProc, this, DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV); break; case KEYBOARD: // Always 256-button. for( int b = 0; b < 256; ++b ) { input_t in; in.type = in.KEY; in.num = ConvertScancodeToKey(b); in.ofs = b; buttons++; Inputs.push_back(in); } break; case MOUSE: Device->EnumObjects( DIMouse_EnumDevObjectsProc, this, DIDFT_BUTTON | DIDFT_AXIS | DIDFT_ANYINSTANCE ); break; } { DIPROPDWORD dipdw; memset(&dipdw, 0, sizeof(dipdw)); dipdw.diph.dwSize = sizeof(dipdw); dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); dipdw.diph.dwObj = 0; dipdw.diph.dwHow = DIPH_DEVICE; dipdw.dwData = INPUT_QSIZE; hr = Device->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph ); if ( hr == DI_POLLEDDEVICE ) { /* This device doesn't support buffering, so we're forced * to use less reliable polling. */ buffered = false; } else if ( hr != DI_OK ) { LOG->Info( hr_format(hr, "OpenDevice(%s): IDirectInputDevice2::SetProperty", m_sName.c_str()) ); return false; } } return true; }
/*** IUnknown methods ***/ HRESULT _stdcall QueryInterface (REFIID riid, LPVOID * ppvObj) { return RealDevice->QueryInterface(riid,ppvObj); }