VOID CInputManager::Initial(VOID*) { HRESULT hr; m_hWnd = g_hMainWnd; // Create a DInput object if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&m_pDI, NULL ) ) ) { TDThrow(_T("Create a DInput object error:%08X"), hr); return; } // Create the keyboard device hr = m_pDI->CreateDevice(GUID_SysKeyboard, &m_lpDIDKeyboard, NULL); if(hr == DI_OK) { m_lpDIDKeyboard->SetDataFormat(&c_dfDIKeyboard); m_lpDIDKeyboard->SetCooperativeLevel(g_hMainWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); AcquireKeyboard(); } }
///////////////////////////////////////////////////////////////////// // CInputSystem::InitializeSystem ///////////////////////////////////////////////////////////////////// bool CInputSystem::InitializeSystem(void *initStructure) { // -------------------------------------------------------------- // Get the initialization parameters if (initStructure == NULL) { return false; } SInputSystemInfoStructure *initParams = (SInputSystemInfoStructure*)initStructure; if (initParams->windowHandle == NULL) { return false; } if (initParams->instance == NULL) { return false; } // -------------------------------------------------------------- // Initialize DirectInput HRESULT hr = DirectInput8Create(initParams->instance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&diObject, NULL); if (FAILED(hr)) { return false; } inputSystemInfo.instance = initParams->instance; inputSystemInfo.windowHandle = initParams->windowHandle; // -------------------------------------------------------------- // Create input devices if (!CreateMouseDevice()) { return false; } if (!CreateKeyboardDevice()) { return false; } // -------------------------------------------------------------- // Acquire Devices if (!AcquireMouse()) { return false; } if (!AcquireKeyboard()) { return false; } return true; }
///////////////////////////////////////////////////////////////////// // CInputSystem::ReadKeyboardState ///////////////////////////////////////////////////////////////////// bool CInputSystem::ReadKeyboardState() { HRESULT hr; if (!keyboardDevice) { return false; } //--------------------------------------------------------------- // Get Keyboard State hr = keyboardDevice->GetDeviceState( sizeof(keyBoardStateBuffer), (LPVOID)&keyBoardStateBuffer ); if (SUCCEEDED(hr)) { return true; } // If Keyboard focus lost then reacquire if (hr==DIERR_INPUTLOST) { // Try again if (AcquireKeyboard()) { //------------------------------------------------------- // Get Keyboard State hr = keyboardDevice->GetDeviceState( sizeof(keyBoardStateBuffer), (LPVOID)&keyBoardStateBuffer ); if (SUCCEEDED(hr)) { return true; } } } // TODO: Temp Debug Text std::cout << "Keyboard Input Error: " << hr << std::endl; return false; }
VOID CInputSystem::KeybordTick(VOID) { if(!m_lpDIDKeyboard) return; //保留旧状态 memcpy(m_byOldKeys, m_byCurKeys, NUMDIKEYS); HRESULT hRet = m_lpDIDKeyboard->GetDeviceState(NUMDIKEYS, m_byCurKeys); if(hRet != DI_OK) AcquireKeyboard(); else { for(INT i=0; i<NUMDIKEYS; i++) { m_bKeyPresses[i] = (!(m_byOldKeys[i]&0x80) && (m_byCurKeys[i]&0x80)); //该键刚被按下 m_bKeyPresseds[i] = ((m_byOldKeys[i]&0x80) && !(m_byCurKeys[i]&0x80)); //该键刚被释放 //保存键盘输入事件 if(m_bKeyPresses[i]) { AddEvent(EVENT_KEY_DOWN, i); } if(m_bKeyPresseds[i]) { AddEvent(EVENT_KEY_UP, i); } } } //检查是否有自动发送的RepeatKeyDown if(m_bCatchKeyDown && !IsEventExist(EVENT_KEY_DOWN)) { switch (m_Buf_WM_KEYDOWN.first) { case VK_LEFT: AddEvent(EVENT_KEY_DOWN, KC_LEFT); break; case VK_UP: AddEvent(EVENT_KEY_DOWN, KC_UP); break; case VK_RIGHT: AddEvent(EVENT_KEY_DOWN, KC_RIGHT); break; case VK_DOWN: AddEvent(EVENT_KEY_DOWN, KC_DOWN); break; case VK_BACK: AddEvent(EVENT_KEY_DOWN, KC_BACK); break; } } m_bCatchKeyDown = FALSE; }