2013-03-25 25 views
7

Ich benutze diese Funktion, um den Cursor zu bewegen.C# zuverlässig MouseMove (Hop)

[DllImport("user32.dll")] 
static extern bool SetCursorPos(int X, int Y); 

Wenn ich eine Hotkey es triggern, wird der Cursor auf die richtigen Koordinaten zu bewegen und das nächste Mal I bewegen, um die Maus, um es aus dieser Position fortsetzt. Arbeiten wie vorgesehen.

Allerdings muss ich SetCursorPos während eines MouseMove-Ereignisses auslösen. Wenn der Benutzer die Maus in einen bestimmten Bereich bewegt, möchte ich, dass er an einen anderen Ort springt und von dort fortfährt. Aber jetzt hüpft es zum Ziel und springt dann sofort zurück (90% der Zeit). Wie kann ich dieses Verhalten vermeiden?

Edit: Ich beschloss, um es zu umgehen, indem Sie den Cursor in 1 x 1 px Quadrat für 1 Mousemove-Ereignis. Cursor.Clip (Mausposition, neues Rechteck (1, 1));

+4

Bitte geben Sie Ihren MouseMove Event-Handler-Code. –

+0

Ich rufe nur diese Funktion und nichts anderes im MouseMove-Event an. – user1340531

+0

@ user1340531: Post es trotzdem? – mpen

Antwort

1

Meine Vermutung ist, dass es ein weiteres Steuerelement oben auf Ihrem Formular in dem Bereich gibt, in dem Sie das Ereignis auslösen möchten. Wenn dies der Fall ist, erfasst das Steuerelement das Ereignis MouseMove.

Zum Beispiel, hier habe ich ein grünes 200x200 Panel an Position 0, 0 in der oberen linken Ecke hinzugefügt. Wenn sich die Maus über das Bedienfeld bewegt, wird das Ereignis MouseMove des Formulars die Erfassung der Mauszeigerposition stoppen. Im Formular mouse_move meines Formulars habe ich den Text des Formulars so eingestellt, dass die Mauskoordinaten angezeigt werden. Beachten Sie, dass die Koordinaten im Fenster Text immer noch 200, 200 sind, wenn die Maus tatsächlich auf 0, 0 stand (ich kann meinen Cursor nicht sehen, weil ich auf SnippingTool.exe klicken muss, um den Screenshot zu erhalten).

enter image description here

Um dies zu beheben, verwenden Sie den gleichen Code, den Sie in der MouseMove Veranstaltung Panel platziert in MouseMove Veranstaltung Formular (oder je nachdem, welcher steuern Sie verwenden). Dies führt zu den richtigen Koordinaten im Text des Formulars.

enter image description here

Und hier ist der Code (Dies ist offensichtlich in eine einzige Methode Refactoring werden könnte):

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool SetCursorPos(int X, int Y); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 
} 
+0

Mein MouseMove-Ereignis ist eigentlich global, es wird ausgelöst, egal was ich schwebe, solange sich der Cursor bewegt. – user1340531

+2

@ user1340531 Wie die anderen Kommentatoren angegeben haben, müssen Sie diesen Code zu Ihrer Frage hinzufügen. – Inisheer

+1

Hauptsächlich weil es kein "globales" MouseMove-Ereignis gibt, außer Sie haben einen globalen Hook installiert. –

0

Hard mit so wenig Informationen zu sagen (vielleicht ein Screenshot des GUI helfen würde) . Sie könnten versuchen:

private void Button_MouseMove_1(object sender, MouseEventArgs e) 
    { 
     SetCursorPos(0, 0); 
     e.Handled = true; 
    }