SetCursor 在鼠标移动/单击之前不起作用(Win32 Api)

Rya*_*sen 5 c++ winapi windows-messages mouse-cursor

在处理 WM_SETCURSOR Windows 消息时,我对某个光标调用 SetCursor 。如果我将光标设置为与实际不同的内容,它会等到鼠标通过移动或单击获得输入来实际设置它。

有没有办法解决这个问题,以便在光标接受输入之前光标不会在视觉上看起来错误?

case WM_SETCURSOR:
    {
        SetCursor( game->GetCursor() ); // Returns m_curCurrent
        return true;
    }
    break;
Run Code Online (Sandbox Code Playgroud)

当我想要改变光标类型时,我还设置了它。

游戏初始化期间:

m_curDefault        = LoadCursor( m_hInstance, MAKEINTRESOURCE( IDC_DEFAULT_CURSOR ));
m_curAttack         = LoadCursor( m_hInstance, MAKEINTRESOURCE( IDC_ATTACK_CURSOR ));
m_curMove           = LoadCursor( m_hInstance, MAKEINTRESOURCE( IDC_MOVE_CURSOR ));
m_curCurrent        = m_curDefault;
Run Code Online (Sandbox Code Playgroud)

设置光标类型时

void Game::SetCursorType( CursorTypes curType )
{
switch ( curType )
{
case CGame::DefaultCursor:
    m_curCurrent = m_curDefault;
    break;
case CGame::AttackCursor:
    m_curCurrent = m_curAttack;
    break;
case CGame::MoveCursor:
    m_curCurrent = m_curMove;
    break;
default:
    break;
}

}
Run Code Online (Sandbox Code Playgroud)

小智 0

我认为你需要在程序启动时使用 WM_SETCURSOR 获取鼠标,然后它就会拥有鼠标。

RAWMOUSE 根据鼠标的原始分辨率为您提供鼠标的逻辑坐标。

也就是说,您看到鼠标的实际移动。

Windows 将使用鼠标速度和加速度(弹道)设置来更新光标位置。当然,因为两者没有联系——必须解释鼠标的明显移动以生成光标移动,否则如何支持多个鼠标?

如果您希望控制指针,据我所知,没有理由重复 Windows 鼠标弹道计算。让windows来做就可以了。因此,为了控制指针,您应该只使用WM_MOUSEMOVE。也就是说,除非您希望在应用程序中禁用鼠标加速设置。

但是,如果您想控制玩家的 POV(视点),或者使用鼠标控制游戏中的对象(例如宇宙飞船飞行操纵杆),那么 RAWMOUSE 数据可以为您提供对鼠标移动的最佳访问权限,您可以实现自己的算法将其转换为飞行控制器/POV 运动。