2013-03-25 14 views
7

Sto usando questa funzione per spostare il cursore.C# affidabile MouseMove (hop)

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

Quando uso un tasto per innescare esso, il cursore si sposta alla coordinate corrette e la prossima volta spostare il mouse continua da quella posizione. Funzionando come previsto.

Tuttavia, è necessario attivare SetCursorPos durante un evento MouseMove. Se l'utente sposta il mouse in una determinata area, voglio che salti in un altro posto e prosegua da lì. Ma adesso salta a destinazione e poi immediatamente salta indietro (il 90% delle volte). Come posso evitare questo comportamento?

Modifica: ho deciso di aggirare il problema ritagliando il cursore in 1 x 1 px quadrato per 1 evento mousemove. Cursor.Clip (MousePosition, new Rectangle (1, 1));

+4

Si prega di inviare il codice del gestore di eventi MouseMove. –

+0

Sto letteralmente chiamando questa funzione e nient'altro nell'evento MouseMove. – user1340531

+0

@ user1340531: post comunque? – mpen

risposta

1

La mia ipotesi è che ci sia un altro controllo sulla parte superiore del modulo nell'area in cui si desidera attivare l'evento. In tal caso, il controllo sta acquisendo l'evento MouseMove.

Ad esempio, qui ho aggiunto un pannello verde 200x200 in posizione 0, 0 nell'angolo in alto a sinistra. Se il mouse si sposta sul pannello, l'evento MouseMove del modulo interromperà l'acquisizione della posizione del cursore del mouse. Nell'evento mouse_move del mio modulo, ho impostato il testo del modulo per visualizzare le coordinate del mouse. Si noti che le coordinate nel Testo finestra sono ancora 200, 200 quando il mouse era effettivamente a 0, 0 (non è possibile vedere il mio cursore a causa del clic su SnippingTool.exe per ottenere lo screenshot).

enter image description here

Per ovviare a questo, utilizzare lo stesso codice è stato inserito nel caso del modulo MouseMove nel caso del pannello MouseMove (o qualsiasi controllo che si sta utilizzando). Ciò comporta le coordinate corrette nel testo del modulo.

enter image description here

E qui è il codice (Questo potrebbe ovviamente essere riscritta in un unico metodo):

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

L'evento MouseMove è in realtà globale, viene attivato indipendentemente da ciò che sto passando, purché il cursore si sposti. – user1340531

+2

@ user1340531 Come gli altri commentatori hanno dichiarato, è necessario aggiungere quel codice alla tua domanda. – Inisheer

+1

Principalmente perché non esiste un evento "globale" MouseMove, a meno che non sia stato installato un hook globale. –

0

Difficile dire con tanta poche informazioni (forse uno screenshot del vostro GUI aiuterebbe) . Si potrebbe provare:

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