2013-06-26 2 views
7

Sto utilizzando SendInput() per inviare posizioni relative del mouse. Prima ti ho detto cosa stai facendo.Lo schermo diventa nero quando utilizzo SendInput per inviare le posizioni del cursore del mouse

uso il mio dito per spostare il mouse. Quindi, prima di tutto traccia il mio dito in un'immagine 640x480 e ottengo la posizione assoluta in pixel con nell'immagine.

quindi invio quella posizione al metodo seguente per generare i relativi comandi di posizione del mouse utilizzando l'input di invio.

Quando il dito si sposta sul limite sinistro (xlim1) o sul limite destro (xlim2), il cursore continua a scorrere orizzontalmente verso sinistra o verso destra a seconda del limite. Il problema è quando eseguo il codice e proprio quando il cursore inizia a muoversi, lo schermo diventa nero.

quando io commento la parte else if (cx> = Prevx & & cx> xlim2) section {....}, allora funziona .. (Quindi il punto dito quando va a limitare destra dell'immagine è del cursore continua a scorrere orizzontalmente verso destra, la parte commentata abilita lo scorrimento orizzontale a sinistra).

bool prima variabile sarà vera se questa è la prima volta, catturiamo il dito. Altrimenti è falso.

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

Non c'è connessione evidente tra la generazione di input del mouse e lo "schermo diventa nero". C'è un difetto nel codice, non si inizializza completamente la struttura INPUT, generando dati fasulli per MOUSEINPUT.time e .dwExtraInfo. Usa l'input 'INPUT = {};" Assicurati che ci sia un ragionevole ritardo dopo aver chiamato questo codice. –

+0

Ha funzionato !!!!!!!!!! ..... Wow mi hai salvato la vita ... Non posso ringraziarti abbastanza !!!!!! ......... – user2389323

risposta

6

Prova

ZeroMemory(&input,sizeof(input)); 

anche inizializzare tutte le variabili tra cui input.time ha funzionato per me :)

1

mi sono imbattuto in questo stesso problema, anche se io stava chiamando ZeroMemory e stava facendo tutto il resto correttamente. Stavo usando input.mi.time per informare Windows della spaziatura tra i clic, ad es. quindi il doppio clic funzionerebbe correttamente. Tuttavia stavo ottenendo i valori di "ora" da un computer remoto. Dal momento che differivano dal tempo del computer locale, Windows ha provocato lo screen saver! Per risolvere il problema, ho aggiunto alcuni elementi logici per rilevare l'inclinazione tra i computer e portare i valori in qualche modo in linea l'uno con l'altro.

In sintesi: assicurarsi che input.mi.time sia zero o un valore un po 'vicino a GetTickCount(). Usare ZeroMemory per inizializzare la variabile è un eccellente suggerimento.

+0

Grazie mille per aver effettuato la connessione con lo screen saver! –