c++ Directx鼠标输入焦点丢失后行为怪异

C++ Directx mouse input acting weird after focus lost

本文关键字:Directx 鼠标 输入 焦点 c++      更新时间:2023-10-16

你好,在我失去窗口焦点(alt+tab/windows键)后,我的鼠标输入有一个小问题。

当焦点回到游戏窗口时,鼠标(偏航)动作缓慢且没有响应(由于某些原因,俯仰运行良好)。有时它会动,有时它根本不动。

下面是一些代码:

bool Game::initDirectInput(HINSTANCE hInstance)
{
    hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&directInput, NULL); 
    hr = directInput->CreateDevice(GUID_SysKeyboard, &DIKeyboard, NULL);
    hr = directInput->CreateDevice(GUID_SysMouse, &DIMouse, NULL);
    hr = DIKeyboard->SetDataFormat(&c_dfDIKeyboard);
    hr = DIKeyboard->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
    hr = DIMouse->SetDataFormat(&c_dfDIMouse2);
    hr = DIMouse->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE | DISCL_NOWINKEY);
    return true;
}
void Game::detectInput(double delta)
{
    DIMOUSESTATE2 mouseCurrState;
    BYTE keyboardState[256];
    DIKeyboard->Acquire();
    DIMouse->Acquire();
    DIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &mouseCurrState);
    DIKeyboard->GetDeviceState(sizeof(keyboardState),(LPVOID)&keyboardState);
    camera.detectInput(delta, &keyboardState[0], &mouseCurrState);
}
void Camera::detectInput(double delta, BYTE *keyboardState, DIMOUSESTATE2 *mouseCurrState){
    float speed = 16.0f * delta;

    ...

    if((mouseCurrState->lX != mouseLastState.lX) || (mouseCurrState->lY != mouseLastState.lY))
{
    camYaw += mouseCurrState->lX * 0.002f;
    camPitch += mouseCurrState->lY * 0.002f;
    if(camPitch > 0.85f)
        camPitch = 0.85f;
    if(camPitch < -0.85f)
        camPitch = -0.85f;
    mouseLastState = *mouseCurrState;
}
    update();
    return;
}
void Camera::update(){
    camRotationMatrix = XMMatrixRotationRollPitchYaw(camPitch, camYaw, 0);
    camTarget = XMVector3TransformCoord(DefaultForward, camRotationMatrix );
    camTarget = XMVector3Normalize(camTarget);
    XMMATRIX RotateYTempMatrix;
    RotateYTempMatrix = XMMatrixRotationY(camYaw);
    camRight = XMVector3TransformCoord(DefaultRight, RotateYTempMatrix);
    camForward = XMVector3TransformCoord(DefaultForward, RotateYTempMatrix);
    camUp = XMVector3Cross(camForward, camRight);
    camPosition += moveLeftRight*camRight;
    camPosition += moveBackForward*camForward;
    camPosition += moveUpDown*DefaultUp;
    moveLeftRight = 0.0f;
    moveBackForward = 0.0f;
    moveUpDown = 0.0f;
    camTarget = camPosition + camTarget;    
    camView = XMMatrixLookAtLH( camPosition, camTarget, camUp );
}

对于那些想知道,我刚刚开始学习c++和directx使用这个教程:http://www.braynzarsoft.net/index.php?p=DX11Lessons(虽然我有相当多的经验使用OpenGL + java)

我已经通过添加一个简单的if语句解决了这个问题:

if(mouseLastState.lX > -10000 && mouseLastState.lX < 10000){
    camYaw += mouseLastState.lX * 0.002f;
}

问题是当窗口重新获得焦点时,它将返回如此高的值,使得偏航不再有效。