当我使用SendInput发送鼠标光标位置时,屏幕变黑

时间:2013-06-26 08:57:59

标签: c++ winapi sendinput

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

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

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

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

当我评论其他部分if(cx> = prevX&& cx> xlim2){....}部分时,它的工作原理..(所以当手指点到达右边界时图像光标保持水平向右滚动。评论部分启用左水平滚动。

如果这是第一次,我们捕获手指,那么第一次变量将是真的。否则就是假的。

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;
}

}

2 个答案:

答案 0 :(得分:6)

尝试

ZeroMemory(&input,sizeof(input));

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

答案 1 :(得分:2)

我遇到了同样的问题,即使我正在调用ZeroMemory并正确地做其他事情。我正在使用input.mi.time来通知Windows点击之间的间距,例如:所以双击将正常工作。但是我得到了时间&#39;来自远程计算机的值。因为它们与本地计算机的时间不同,导致Windows调用屏幕保护程序!为了解决这个问题,我添加了一些逻辑来检测计算机之间的偏差,并使值略微相互一致。

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