2012-12-28 12 views
5

Ich habe versucht, ein kleines Dienstprogramm zu schreiben, das die Grenzen der Position meiner Maus auf dem gesamten Bildschirm ändert. Ich habe die globale Maus-Hook-Bibliothek verwendet, die ich gefunden habe here (ich verwende Version 1), und dann die Mauspositionsinformationen aus dem Ereignis, das es erzeugt, an meine eigene Funktion übergeben (nur ein Test, um es für jetzt zu arbeiten) .Stellen Sie die Mausposition nicht ein C#

internal void ProcessMouseEvent(System.Drawing.Point point) 
{ 
    Cursor.Position = new Point(50,50); 
} 

Wenn es ausgeführt wird, wird die Maus erscheinen auf den angegebenen Punkt zu blinken, wird aber sofort wieder zurück, wo sie vor der Änderung war, wenn es ein Bewegungsereignis war. Nur wenn es durch ein Klickereignis gemacht wurde, bleibt es tatsächlich an der neuen Position.

Antwort

3

Um zu begrenzen, wo die Maus effizient gehen kann, müssen Sie cursor.clip verwenden. Sie finden die Dokumentation here. Es wird tun, was Sie wollen, viel einfacher und ist der empfohlene Weg.

+0

Was ist, wenn meine Grenzen nicht rechteckig sind? – littlerat

+0

@littlerat Ihre Frage hat keinen Kreis erwähnt. Sie müssen ein Rechteck mit cursor.clip verwenden. Es tut uns leid! – FrostyFire

+0

Nun, es ist auch nicht rund. Was ich versuche ist, [this] (http://i.imgur.com/6lpmk.jpg) in [this] (http://i.imgur.com/KhWb0.jpg) zu verwandeln, ohne das tatsächlich zu ändern Bildschirmauflösungen. – littlerat

3

Das Problem hier ist, dass der Haken gibt Ihnen eine Benachrichtigung der Maus Nachricht. Es verhindert jedoch nicht, dass es von der Anwendung verarbeitet wird, die die Benachrichtigung tatsächlich verarbeitet. So wird es wie normal gehandhabt und die Maus bewegt sich wo sie hin will. Was Sie tun müssen, ist, die Nachricht zu blockieren, damit sie weitergeleitet wird. Dazu müssen Sie einen Wert ungleich Null vom Hook-Callback zurückgeben.

Die Bibliothek erlaubt Ihnen nicht, mit dem Hook-Callback-Rückgabewert zu basteln, es wird eine Operation erforderlich machen. Vorsicht, es ist fehlerhaft. Ich verwende stattdessen this sample code. Mit diesem Beispiel Callback-Methode:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { 
    if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) { 
     System.Windows.Forms.Cursor.Position = new Point(50, 50); 
     return (IntPtr)1; // Stop further processing! 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

Und Sie werden sehen, es ist jetzt fest stecken. Verwenden Sie Alt + Tab, Alt + D, E, um die Kontrolle wiederzuerlangen.

+0

Ausgezeichnete Antwort, was ich getan habe, ist 'nur einmal nach dem Setzen der Cursor-Position 'Return new IntPtr (1)' hinzufügen, und es blieb an Ort und Stelle und erlaubte dem Benutzer weiterhin die Maus in nachfolgenden Ereignissen zu bewegen. –