【问题标题】:WM_MOUSEWHEEL only works in one direction on Windows 7 / 64bitsWM_MOUSEWHEEL 在 Windows 7 / 64bits 上只能单向工作
【发布时间】:2021-02-19 04:07:42
【问题描述】:

我为游戏中的 3D 效果制作了这段代码,这段代码有助于改变位置和放大 + 缩小屏幕!

但是,如果我在 win 7 64 位上运行它,当滚动鼠标滚轮时,向前和向后滚动,它只会放大,但在 Windows 7 32 位上运行时它可以正常工作!

我该如何解决它以获得任何胜利?
谢谢你的帮助!!!!

LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)

{

MOUSEHOOKSTRUCTEX* mhs = (MOUSEHOOKSTRUCTEX*)lParam;
HWND MuWnd = FindWindow(TEXT("MU"), NULL);

if(UseCamera)
{
    if(GetForegroundWindow() == MuWnd)
    {

        if(InitCamera)
        {

            Camera.ClipX  = *Camera_ClipX;
            Camera.ClipY  = *Camera_ClipY;
            Camera.GlClip = *Camera_GlClip;
            Camera.PosZ   = *Camera_PosZ;
            Camera.RotY   = *Camera_RotY;
            Camera.RotZ   = -45;
            Camera.Zoom   = *Camera_Zoom;
            InitCamera    = false;

        }

        else if(wParam == WM_MBUTTONDOWN)
        {
            MouseX = mhs->pt.x;
            MouseY = mhs->pt.y;
            MoveCamera = true;
        }

        else if(wParam == WM_MBUTTONUP)
        {
            MoveCamera = false;
        }

        else if(wParam == WM_MOUSEWHEEL)
        {
            int direction = mhs->mouseData;
            if(direction < 0)
            {
                if(*Camera_Zoom < 60)
                {
                    *Camera_Zoom += 2;
                }
                *Camera_ClipX  = 1190 + (abs(*Camera_PosZ - 150) * 3) + 4000;
                *Camera_ClipY  = 2400 + (abs(*Camera_PosZ - 150) * 3) + 4000;
                *Camera_GlClip = 2300 + (abs(*Camera_PosZ - 150) * 3) + 4000;
            }

            else if(direction > 0)
            {
                if(*Camera_Zoom > 12)
                {
                    *Camera_Zoom -= 2;
                }
                *Camera_ClipX  = 1190 + (abs(*Camera_PosZ - 150) * 3) + 4000;
                *Camera_ClipY  = 2400 + (abs(*Camera_PosZ - 150) * 3) + 4000;
                *Camera_GlClip = 2300 + (abs(*Camera_PosZ - 150) * 3) + 4000;
            }
        }

        else if(wParam == WM_MOUSEMOVE)
        {
            if(MoveCamera)
            {
                if(MouseX < mhs->pt.x)
                {
                    *Camera_RotZ += 8;
                    if (*Camera_RotZ > 315) *Camera_RotZ = -45;
                }

                else if(MouseX > mhs->pt.x)
                {
                    *Camera_RotZ -= 8;
                    if (*Camera_RotZ < -405) *Camera_RotZ = -45;
                }

                if(MouseY < mhs->pt.y)
                {
                    if(*Camera_RotY < -45)
                    {
                        *Camera_PosZ -= 44;
                        *Camera_RotY += (double)2.42;
                    }
                }

                else if(MouseY > mhs->pt.y)
                {
                    if(*Camera_RotY > -90)
                    {
                        *Camera_PosZ += 44;
                        *Camera_RotY -= (double)2.42;
                    }
                }

                MouseX = mhs->pt.x;
                MouseY = mhs->pt.y;

                *Camera_ClipX  = 1190 + (abs(*Camera_PosZ - 150) * 3) + 4000;
                *Camera_ClipY  = 2400 + (abs(*Camera_PosZ - 150) * 3) + 4000;
                *Camera_GlClip = 2300 + (abs(*Camera_PosZ - 150) * 3) + 4000;
            }
        }
    }
}
return CallNextHookEx(MouseHook, code, wParam, lParam);
}

【问题讨论】:

标签: visual-c++ windows-7-x64 mousewheel mouse-hook


【解决方案1】:

通过该修复程序解决了问题:
http://support.microsoft.com/kb/2752274/en-us

【讨论】:

  • 链接死了。此外,出于完全相同的原因,请不要发布“仅链接”解决方案。您能否提供详细信息作为对原始答案的修改?
【解决方案2】:

您可以从文档中阅读:

鼠标数据 类型:双字 如果消息是 WM_MOUSEWHEEL,则该成员的 HIWORD 是车轮增量。 LOWORD 未定义且保留。正值表示滚轮向前旋转,远离用户;负值表示轮子向后旋转,朝向用户。一次滚轮点击定义为 WHEEL_DELTA,即 120。

所以我想如果你使用 HIWORD(mhs->mouseData) 可能会更好。另请注意,结果是无符号的。

【讨论】:

  • 谢谢!但是如果结果是无符号的,我可以用“direction”变量做什么?为了检测鼠标滚轮何时向前或向后旋转?我试过“unsigned int direction = HIWORD(mhs->mouseData);”并尝试将结果导出到output.txt,虽然我前后旋转鼠标滚轮,结果总是30378!
  • 要测试标志,只需在之前将其转换为短:(short)HIWORD(mhs->mouseData)
  • 我试过`ofstream myfile; myfile.open("output.txt",fstream::in | fstream::out | fstream::app); myfilemouseData)
  • 您能帮帮我吗? :( 谢谢你
【解决方案3】:

我通过在 WM_MOUSEWHEEL 事件中测试非零来解决了这个问题... 然后测试是否为“120”...

WM_MOUSEWHEEL:
if(HIWORD(wParam) == 120)
{
//Do Code for forward
}
else
{ 
//Do Code for reverse
}

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2014-01-12
    • 2011-09-11
    • 2020-03-11
    • 2012-07-04
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多