SendInput鼠标时间

时间:2018-02-02 22:40:47

标签: c++ winapi mousemove smoothing sendinput

所以基本上我要做的就是将鼠标平滑地移动到中心位置。 我在这里工作得很好,但它将光标瞬间传送到中心。

此外,如果我将input.mi.time设置为大于0的值,它会让我的PC进入睡眠状态。任何人都可以解释它甚至更多吗? documentation并没有真正为我澄清。

#include <iostream>
#include <Windows.h>

int screenWidth;
int screenHeight;

void moveMouse(int x, int y)
{
    POINT mouseCoords;
    GetCursorPos(&mouseCoords);

    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_MOVE;
    input.mi.dwExtraInfo = NULL;
    input.mi.mouseData = NULL;
    input.mi.dx = -mouseCoords.x + x;
    input.mi.dy = -mouseCoords.y + y;
    input.mi.time = NULL;

    SendInput(1, &input, sizeof(INPUT));
}

void main()
{
    screenWidth = GetSystemMetrics(SM_CXSCREEN);
    screenHeight = GetSystemMetrics(SM_CYSCREEN);
    int middleOfScreenX = screenWidth / 2;
    int middleOfScreenY = screenHeight / 2;

    moveMouse(middleOfScreenX, middleOfScreenY);
}

1 个答案:

答案 0 :(得分:2)

您遇到的问题与Raymond Chen在2012年的帖子中描述的完全相同:

When you synthesize input with SendInput, you are also synthesizing the timestamp(重点是我的):

  

当客户使用SendInput函数模拟拖放操作以进行自动测试时,客户报告了一个问题。

     

嗯,是的,所有事件都会立即发生,因为您一次性提交了所有事件。

     

time结构中的MOUSE­INPUT字段不会导致播放延迟

解决方案也在发布:

  

如果你想要三个输入事件,它们之间有500毫秒的延迟,那么你需要调用SendInput三次,在两次调用之间延迟500ms。