Экран становится черным, когда я использую SendInput для отправки позиций курсора мыши

Я использую SendInput () для отправки относительных позиций мыши. Сначала я скажу тебе, что я делаю.

Я использую свой палец, чтобы двигать мышь. Итак, сначала я отслеживаю палец на изображении 640×480 и получаю абсолютную позицию в пикселях на изображении.

затем я отправляю эту позицию следующему методу, чтобы сгенерировать команды относительного положения мыши, используя ввод ввода

Когда палец перемещается к левой границе (xlim1) или правой границе (xlim2), курсор продолжает прокручиваться горизонтально влево или вправо в зависимости от того, какой предел.
Проблема в том, что когда я запускаю код и только когда курсор начинает двигаться, экран становится черным.

когда я комментирую часть еще, если (cx> = prevX && cx> xlim2) {….}, затем он работает .. (Таким образом, когда точка пальца достигает правого предела изображения, курсор продолжает прокручивать горизонтально вправо. прокомментированная часть включает горизонтальную прокрутку влево).

Первая переменная bool будет иметь значение true, если это первый раз, когда мы фиксируем палец. В противном случае это неверно.

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

}

7

Решение

Пытаться

ZeroMemory(&input,sizeof(input));

также инициализировать все переменные, включая input.time
у меня это сработало 🙂

6

Другие решения

Я столкнулся с этой же проблемой, хотя я звонил в ZeroMemory и делал все остальное правильно. Я использовал input.mi.time, чтобы проинформировать Windows о расстоянии между щелчками, например поэтому двойной щелчок будет работать правильно. Однако я получал значения «времени» с удаленного компьютера. Поскольку они отличались от времени на локальном компьютере, это заставляло Windows вызывать заставку! Чтобы обойти эту проблему, я добавил логику, чтобы обнаружить перекос между компьютерами и привести значения в соответствие друг с другом.

В итоге: убедитесь, что input.mi.time равен нулю или имеет значение, близкое к GetTickCount (). Использование ZeroMemory для инициализации переменной является отличным предложением.

1

По вопросам рекламы [email protected]