10

我正在使用 SendInput() 发送鼠标的相对位置。首先生病告诉你在做什么。

我用手指移动鼠标。因此,首先我在 640x480 图像中跟踪我的手指并获取图像中像素的绝对位置。

然后我将该位置发送到以下方法,以使用发送输入生成相对鼠标位置命令。

当手指移动到左边界 (xlim1) 或右边界 (xlim2) 时,光标会根据哪个限制水平向左或向右滚动。问题是当我运行代码时,就在光标开始移动时,屏幕变黑。

当我评论其他部分 if(cx >= prevX && cx > xlim2){ .... } 部分时,它可以工作.. (所以当手指指向图像的右边界时,它的光标会一直水平滚动到对。注释部分启用左侧水平滚动)。

如果这是我们第一次捕获手指,则 bool first 变量将为真。否则为假。

void movMouse(int cx, int cy, bool first){
static int prevX = 0;
static int prevY = 0;

static int leftPrevX;
static int rightPrevX;

int mx,my;

if(first == true){
    prevX = cx;
    prevY = cy;
}
else{
    mx = (cx - prevX);
    my = (cy - prevY);

    if(cx <= prevX && cx < xlim1){
        mx = -20;

        INPUT input;
        input.type          = INPUT_MOUSE;
        input.mi.mouseData  = 0;
        input.mi.dx         = -(mx);
        input.mi.dy         =  (my);

        input.mi.dwFlags    =  MOUSEEVENTF_MOVE;

        SendInput(1, &input, sizeof(input));
    }
    else if(cx >= prevX && cx > xlim2){
        mx = 20;

        INPUT input;
        input.type          = INPUT_MOUSE;
        input.mi.mouseData  = 0;
        input.mi.dx         = -(mx);
        input.mi.dy         =  (my);

        input.mi.dwFlags    =  MOUSEEVENTF_MOVE;

        SendInput(1, &input, sizeof(input));
    }
    else {
        INPUT input;
        input.type          = INPUT_MOUSE;
        input.mi.mouseData  = 0;
        input.mi.dx         = -(mx);
        input.mi.dy         =  (my);

        input.mi.dwFlags    =  MOUSEEVENTF_MOVE;

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

    prevX = cx;
    prevY = cy;
}

}

4

2 回答 2

10

尝试

ZeroMemory(&input,sizeof(input));

还初始化所有变量,包括对我有用的 input.time :)

于 2014-03-28T17:07:31.940 回答
2

我遇到了同样的问题,即使我正在调用 ZeroMemory 并正确执行其他所有操作。我正在使用 input.mi.time 来通知 Windows 点击之间的间距,例如,双击可以正常工作。但是,我从远程计算机获取“时间”值。因为它们与本地计算机的时间不同,所以导致 Windows 调用屏幕保护程序!为了解决这个问题,我添加了一些逻辑来检测计算机之间的偏差,并使这些值在某种程度上彼此一致。

总结:确保 input.mi.time 为零或接近 GetTickCount() 的值。使用 ZeroMemory 初始化变量是一个很好的建议。

于 2014-09-12T19:18:20.743 回答