INPUT_MOUSE:鼠标不会随给定的dx / dy值移动

时间:2012-03-30 16:26:45

标签: c++ mousemove

我正在使用INPUT移动鼠标来设置光标位置。这很好,除了我不能使用屏幕值来移动光标。如果我想将光标从0设置为1680,我必须使用 1680 * 0.66作为dx 值来获得正确的位置(在游戏内或桌面上)。

(我使用mousemove,因为我在游戏中设置光标位置,绝对定位在那里不起作用。我有两个屏幕,一个是1680宽,另一个是1280)

任何想法为什么我必须使用这个因素或它来自哪里?谢谢。

#define MOUSE_MOVE_FACTOR 0.6619

        //Set mouse pos:
        void setMousePos(int iX, int iY){


            iX = (int)((double)iX*MOUSE_MOVE_FACTOR);
            iY = (int)((double)iY*MOUSE_MOVE_FACTOR);


            INPUT *buffer = new INPUT[1];

            buffer->type = INPUT_MOUSE;
            buffer->mi.dx = iX;
            buffer->mi.dy = iY;
            buffer->mi.mouseData = 0;
            buffer->mi.dwFlags = MOUSEEVENTF_MOVE;
            buffer->mi.time = 0;
            buffer->mi.dwExtraInfo = 0;

            SendInput(1,buffer,sizeof(INPUT));

            Sleep(100 + (rand() % 50));

        }

4 个答案:

答案 0 :(得分:1)

鼠标加速可能有些问题。禁用它会导致鼠标位置不同。

答案 1 :(得分:0)

内存泄漏可能会对您的应用程序造成奇怪的影响,这可能会产生影响。

每次第buffer次分配

调用此函数时,都会导致内存泄漏

buffer = new INPUT[1];

答案 2 :(得分:0)

根据MOUSEINPUT上的文档,如果未在dwFlags中设置MOUSEEVENTF_ABSOLUTE,则dx / dy是相对坐标。尝试:

 buffer->mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE;

看看是否有效。请注意,您必须将X / Y转换为0-65535的标准化绝对坐标,如文档所述。

我还要问你为什么要先把头寸设定为(-3000,-3000)。我猜你也不需要MOUSE_MOVE_FACTOR的神奇因子,这可能是因为混合了相对/绝对鼠标坐标。

编辑:重新阅读您的问题,我错过了您可能故意使用相对鼠标位置。我猜你的绝对定位可能因为没有使用标准化的绝对坐标而失败(我不会在没有阅读整个文档的情况下猜到自己)。还要注意1680x0.66 = 1109,这可疑接近1024,我猜可能是游戏运行的是1024x?分辨率。

答案 3 :(得分:0)

我知道这很老,但只适合其他人。 MOUSEINPUTmouse_event的文档解释了绝对定位已标准化为0-65535范围。

如果指定了MOUSEEVENTF_ABSOLUTE值,则dx和dy包含 归一化的绝对坐标介于0到65,535之间。事件 过程将这些坐标映射到显示表面上。坐标 (0,0)映射到显示表面的左上角; 坐标(65535,65535)映射到右下角。在一个 多监视器系统,坐标映射到主监视器。

因此,转换将为x /(w-1)* 65535和y /(h-1)* 65535。