c++ Directx鼠标输入焦点丢失后行为怪异
C++ Directx mouse input acting weird after focus lost
你好,在我失去窗口焦点(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;
}
问题是当窗口重新获得焦点时,它将返回如此高的值,使得偏航不再有效。
相关文章:
- WinAPI挂钩鼠标
- 如何在directx/c++中进行平移/缩放操作
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- DrawIndexedInstanced 具有不同的 Index Count per Instance (Directx
- 如何在鼠标挂钩过程中检测拖动
- Win32 发送输入鼠标移动滞后并冻结
- Directx 11 - CompileFromFile() is not compiling
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 字节数组初始化会导致 DirectX 崩溃
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 在 macOS 中使用 C/C++ 设置鼠标光标图像
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- 如何在后台模拟鼠标单击到 DirectX 应用程序?
- 将鼠标单击发送到以管理员身份运行的DirectX游戏
- 管理输入 带有 DirectX DirectInput 的鼠标
- c++ Directx鼠标输入焦点丢失后行为怪异