2013-06-26 14 views
7

Ich verwende SendInput(), um relative Positionen der Maus zu senden. Zuerst krank tel, was ich tue.Der Bildschirm wird schwarz, wenn ich SendInput zum Senden von Mauszeigerpositionen verwende

Ich benutze meinen Finger, um die Maus zu bewegen. Also zuerst verfolge ich meinen Finger in einem 640x480 Bild und erhalte die absolute Position in Pixeln mit im Bild.

Dann sende ich diese Position an die folgende Methode, um relative Mauspositionsbefehle mittels Sendeeingabe zu erzeugen.

Wenn der Finger an den linken Rand (xlim1) oder den rechten Rand (xlim2) springt, scrollen Sie horizontal nach links oder rechts, je nachdem, welches Limit gilt. Das Problem ist, wenn ich den Code ausführen und nur wenn der Cursor beginnt zu bewegen, wird der Bildschirm zu schwarz.

, wenn ich einen kurzen Kommentar zum Teil else if (cx> = Prevx & & cx> xlim2) {....} Abschnitt, dann funktioniert es .. (also die, wenn Finger Punkt geht nach rechts Grenze des Bildes es Cursor Scrollen horizontal nach rechts. Der kommentierte Teil ermöglicht das horizontale Scrollen nach links.

bool erste Variable wird wahr, wenn dies das erste Mal ist, erfassen wir den Finger. Sonst ist es falsch.

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

Es gibt keine offensichtliche Verbindung zwischen Mauseingabe und "Bildschirm wird schwarz". Es gibt einen Fehler in Ihrem Code, Sie initialisieren die INPUT-Struktur nicht vollständig und generieren falsche Daten für MOUSEINPUT.time und .dwExtraInfo. Verwenden Sie 'INPUT input = {};" Stellen Sie sicher, es gibt eine angemessene Verzögerung, nachdem Sie diesen Code aufrufen. –

+0

Es hat funktioniert !!!!!!!!!! ..... Wow du mein Leben gerettet ... Ich kann Ihnen nicht danken genug !!!!!! ......... – user2389323

Antwort

6

Versuchen

ZeroMemory(&input,sizeof(input)); 

auch input.time einschließlich aller Variablen intialize es für mich gearbeitet :)

1

Ich lief in das gleiche Problem, obwohl ich rief ZeroMemory an und machte alles andere richtig. Ich habe input.mi.time verwendet, um Windows über den Abstand zwischen den Klicks zu informieren, z. Ein Doppelklick würde also korrekt funktionieren. Allerdings habe ich die Zeitwerte von einem entfernten Computer bekommen. Da sie sich von der Zeit des lokalen Computers unterschieden, hat Windows den Bildschirmschoner aufgerufen! Zur Umgehung des Problems habe ich eine Logik hinzugefügt, um den Versatz zwischen den Computern zu erkennen und die Werte einigermaßen in Einklang zu bringen.

Zusammenfassend: Stellen Sie sicher, dass input.mi.time entweder Null ist oder einen Wert, der nahe an GetTickCount() liegt. Die Verwendung von ZeroMemory zur Initialisierung der Variablen ist ein ausgezeichneter Vorschlag.

+0

Vielen Dank für die Verbindung mit dem Bildschirmschoner! –