Direct Input - Mouse/Key Up-Event?
-
Grüsse.
Gibts ne Möglichkeit bei DInput8 auch die Button-Up-Evens zu capturen? ich hab keine Möglichkeit gefunden.
Im moment poll ich die daten so:dtByte* dtKeyboard::process() { HRESULT result = 0; dtZeroMemory(m_keys, sizeof(dtByte)*256); if (!m_keyboard) { return NULL; } result = m_keyboard->GetDeviceState(sizeof(dtByte)*256, m_keys); if (FAILED(result)) { result = m_keyboard->Acquire(); while(result != DI_OK) { result = m_keyboard->Acquire(); } return NULL; } return m_keys; } dtMouseInput* dtMouse::process() { DWORD result = 0; DIMOUSESTATE2 state; dtZeroMemory(&state, sizeof(DIMOUSESTATE2)); // Get the State of Device if (m_mouse) { result = m_mouse->GetDeviceState(sizeof(DIMOUSESTATE2), &state); } // Input lost if (FAILED(result)) { result = m_mouse->Acquire(); while( result != DI_OK ) { result = m_mouse->Acquire(); } } m_data.X = state.lX; m_data.Z = state.lZ; m_data.Y = state.lY; for (dtUint i = 0; i < 8; i++) { m_data.mousebtn[i] = state.rgbButtons[i]; } return &m_data; }Das ganze sind insg. 3 Singletons (dtMouse, dtKeyboard) und wird von einem InputManager (dtInputManager) in einem separaten Thread geführt.
Für Vorschläge bin ich immer offen
rya.
-
Hm, bin mir jetzt nicht sicher, ob das so mit Immediate Mouse Input geht, ich mache es jedenfalls in dieser Art mit Buffered Mouse Input...
//Abfrage, ob der Mausknopf i gedrückt ist oder nicht if(state.rgbButtons[i] & 0x80) //hier passiert was, wenn der Knopf gedrückt wurde else //Knopf ist losgelassen, mache entsprechendes..oder seh ich das falsch?

-
Hallo.
Sorry für meine späte Antwort, die EMail ging irgendwie unter.
Ich habs jetzt gelöst und fast genauso wie du meintest, aber so einfach gehts doch nicht :D. Wenn ich das mit nem if.. else.. mache, dann hat ja der Key jede Schleife ein Up-Event. Ich hab ein 2tes Array angelegt, und wenn ein Knopf down ist, setze ich den in dem 2ten Array auch auf gedrückt und in der nächsten Schleife wieder zurück.
Schaut so aus:void dtInputManager::onThreadExecution() { dtMouseInput* mouse = NULL; dtByte* keys = NULL; dtByte mod = 0; if (m_initialized == true && m_handler != NULL) { // Obtain data keys = dtKeyboard::getInstance().process(); mouse = dtMouse::getInstance().process(); // Handle Keys if (keys != NULL) { // Cycle Keys and fire events for (dtUint i = 0; i<dtKeybufferSize; i++) { if (m_keymask[i] & 0x80 && !(keys[i] & 0x80) ) { m_handler->onKeyUp(i); m_keymask[i] = 0; } if (keys[i] & 0x80) { m_handler->onKeyDown(i, mod); m_keymask[i] = keys[i]; } } } // Error else { dtSysLogWarning(wxT("dtInput: KEYS NULL!")); } // Handle Mouse if (mouse != NULL) { // Cycle Buttons and fire events for (dtUShort i = 0; i<dtMouseButtonBuffer; i++) { if(m_mousemask.mousebtn[i] & 0x80) { m_mousemask.mousebtn[i] = 0; m_handler->onMouseBtnUp(i); } if (mouse->mousebtn[i] & 0x80) { m_mousemask.mousebtn[i] = mouse->mousebtn[i]; m_handler->onMouseBtnDown(i); } } m_handler->onMouseMove(mouse->X, mouse->Y); } // Error else { dtSysLogWarning(wxT("dtInput: MOUSE NULL!")); } } }Aber noch ne Frage: Kann ich einfach so während der Laufzeit den Zugriffslevel ändern?
Wenn ich mit exclusivem Zgriff im Vordergrund arbeite, bleibt ja der Mauszeiger in der Mitte des Fensters gefangen. Wenn ich mit nicht exclusivem Zugriff arbeite, kann ich ihn frei bewegen.
Welche Möglichkeiten gibts für mich, das hier dynamisch zu gestalten? So dass ich als Bsp. bei nem Knopfdruck die Maus anzeigen lassen kann und die Maus frei bewegen... einfach Unaquire() und dann SetCoorperativeLevel() oder geht das "eleganter"? Sonst wirds wieder grausam..
*schief grins*rya.