2013-06-26 5 views
7

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

Я использую палец для перемещения мыши. Поэтому сначала я отслеживаю свой палец в изображении 640x480 и получаю абсолютное положение в пикселях с изображением.

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

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

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

bool first variable будет 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; 
} 

}

+0

Нет никакой очевидной связи между генерацией ввода мыши и «экраном становится черным». В вашем коде есть недостаток, вы полностью не инициализируете структуру INPUT, генерируя фиктивные данные для MOUSEINPUT.time и .dwExtraInfo. Используйте 'INPUT input = {};« Убедитесь, что после вызова этого кода существует разумная задержка. –

+0

Это сработало !!!!!!!!!! ..... Вау и спас мою жизнь ... Я не могу поблагодарить вас достаточно !!!!!! ......... – user2389323

ответ

6

Попробуйте

ZeroMemory(&input,sizeof(input)); 

также инициализировать все переменные, в том числе input.time он работал для меня :)

1

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

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

+0

Большое спасибо за подключение к экранной заставке! –