2013-06-26 15 views
7

Używam SendInput() do wysyłania względnych pozycji myszy. Po pierwsze źle rozumiem, co robisz.Ekran jest czarny, gdy używam SendInput do wysyłania pozycji kursora myszy

Używam palca do poruszania myszą. Najpierw śledzę palec w obrazie 640x480 i uzyskuję absolutną pozycję w pikselach na obrazie.

Następnie wysyłam tę pozycję do poniższej metody, aby wygenerować względne polecenia pozycji myszy za pomocą wysyłania danych wejściowych.

Po przesunięciu palca na lewą granicę (xlim1) lub prawą krawędź (xlim2) kursor przewija się poziomo w lewo lub w prawo w zależności od tego, który limit. Problem polega na tym, że uruchomię kod, a gdy tylko zacznie się poruszać kursor, ekran zmieni kolor na czarny.

kiedy skomentować część else if (cx> = PrevX & & cx> xlim2) {....} odcinek, to działa .. (Więc gdy punkt palec idzie do prawej granicy obrazu to kursora przewija poziomo w prawo, skomentowana część włącza przewijanie w lewo).

pierwsza zmienna bool będzie prawdą, jeśli po raz pierwszy przechwycimy palec. W przeciwnym razie jest to fałsz.

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

Nie ma oczywistego związku między generowaniem sygnału myszy a "ekranem idzie na czarno". W Twoim kodzie jest błąd, nie zainicjalizujesz całej struktury INPUT, generując fałszywe dane dla MOUSEINPUT.time i .dwExtraInfo. Użyj 'wejścia wejściowego = {};" Upewnij się, że po wywołaniu tego kodu wystąpiło uzasadnione opóźnienie. –

+0

Zadziałało !!!!!!!!!! ..... Wow, uratowałeś mi życie ... Nie mogę ci podziękować wystarczy !!!!!! ......... – user2389323

Odpowiedz

6

Spróbuj

ZeroMemory(&input,sizeof(input)); 

również intialize wszystkie zmienne w tym input.time pracował dla mnie :)

1

wpadłem na ten sam problem, choć dzwonił do ZeroMemory i robił wszystko poprawnie. Używałem input.mi.time do informowania systemu Windows o odstępach między kliknięciami, np. więc dwukrotne kliknięcie działałoby poprawnie. Jednak otrzymywałem wartości "czasu" ze zdalnego komputera. Ponieważ różniły się one od czasu lokalnego komputera, spowodowały, że Windows wywołał wygaszacz ekranu! Aby obejść ten problem, dodałem trochę logiki, aby wykryć pochylenie między komputerami i nieco zbliżyć wartości do siebie.

Podsumowując: Upewnij się, że input.mi.time ma wartość zero lub wartość zbliżoną do GetTickCount(). Używanie ZeroMemory do zainicjowania zmiennej jest doskonałą sugestią.

+0

Wielkie dzięki za nawiązanie połączenia z wygaszaczem ekranu! –

Powiązane problemy