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

INPUT_MOUSE: mouse does not move with given dx/dy values

本文关键字:dx dy 移动 MOUSE 鼠标 INPUT      更新时间:2023-10-16

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

(我使用鼠标移动,因为我在游戏中设置光标位置,绝对定位在那里不起作用。我有两个屏幕,一个宽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));
        }

可能与鼠标加速有关。禁用它会导致不同的鼠标位置。

内存泄漏可能会给应用程序带来奇怪的事情,这可能会产生影响。

每次上第二次分配buffer调用此函数时,都会导致内存泄漏

buffer = new INPUT[1];

根据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?决议

我知道这是旧的,但只适用于其他人。MOUSEINPUT和mouse_event的文档解释了绝对定位标准化为0-65535。

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

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