我正在使用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;
}
}
答案 0 :(得分:6)
尝试
ZeroMemory(&input,sizeof(input));
还初始化所有变量,包括input.time 它对我有用:)
答案 1 :(得分:2)
我遇到了同样的问题,即使我正在调用ZeroMemory并正确地做其他事情。我正在使用input.mi.time来通知Windows点击之间的间距,例如:所以双击将正常工作。但是我得到了时间&#39;来自远程计算机的值。因为它们与本地计算机的时间不同,导致Windows调用屏幕保护程序!为了解决这个问题,我添加了一些逻辑来检测计算机之间的偏差,并使值略微相互一致。
总结:确保input.mi.time为零或稍微接近GetTickCount()的值。使用ZeroMemory初始化变量是一个很好的建议。