我正在使用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));
}
答案 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)
我知道这很老,但只适合其他人。 MOUSEINPUT和mouse_event的文档解释了绝对定位已标准化为0-65535范围。
如果指定了MOUSEEVENTF_ABSOLUTE值,则dx和dy包含 归一化的绝对坐标介于0到65,535之间。事件 过程将这些坐标映射到显示表面上。坐标 (0,0)映射到显示表面的左上角; 坐标(65535,65535)映射到右下角。在一个 多监视器系统,坐标映射到主监视器。
因此,转换将为x /(w-1)* 65535和y /(h-1)* 65535。