2013-03-25 10 views
7

Używam tej funkcji do przesuwania kursora.C# niezawodny MouseMove (przeskok)

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

Kiedy używać skrótu, aby go wyzwolić, kursor przeniesie się do poprawnych coords i następnym razem przesunąć mysz nadal z tej pozycji. Działaj zgodnie z przeznaczeniem.

Jednak muszę wywołać SetCursorPos podczas zdarzenia MouseMove. Jeśli użytkownik przesunie mysz w pewien obszar, chcę, aby przeskoczył w inne miejsce i kontynuował. Ale teraz przeskakuje do miejsca docelowego, a następnie natychmiast przeskakuje z powrotem (w 90% przypadków). Jak mogę tego uniknąć?

Edytowanie: Postanowiłem obejść go, przycinając kursor w 1 o 1 piksel kwadratowy dla 1 zdarzenia mousemove. Cursor.Clip (MousePosition, new Rectangle (1, 1));

+4

Proszę zaksięgować swój kod obsługi zdarzenia MouseMove. –

+0

Dosłownie po prostu wywołuję tę funkcję i nic więcej w wydarzeniu MouseMove. – user1340531

+0

@ user1340531: Opublikuj mimo to? – mpen

Odpowiedz

1

Domyślam się, że istnieje inna kontrola nad formą w obszarze, w którym chcesz wywołać zdarzenie. Jeśli tak, kontrola przechwytuje zdarzenie MouseMove.

Na przykład tutaj dodałem zielony panel 200x200 w pozycji 0, 0 w lewym górnym rogu. Jeśli mysz przesunie się nad panelem, zdarzenie MouseMove formularza zatrzyma przechwytywanie pozycji kursora myszy. W przypadku mojego formularza mouse_move ustawiam tekst formularza, aby wyświetlał współrzędne myszy. Zauważ, że współrzędne w Oknie Tekst nadal wynoszą 200, 200, gdy mysz była faktycznie na 0, 0 (nie widzę mojego kursora z powodu konieczności kliknięcia na SnippingTool.exe, aby uzyskać zrzut ekranu).

enter image description here

Aby temu zaradzić, należy użyć tego samego kodu złożonego w formularzu za MouseMove wydarzenie w panelu MouseMove zdarzenia (lub dowolnie sterować używasz). Daje to prawidłowe współrzędne w tekście formularza.

enter image description here

A oto kod (Może to oczywiście być refactored do jednej metody):

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

Zdarzenie My MouseMove jest w rzeczywistości globalne, jest wyzwalane bez względu na to, nad czym się kręci, o ile kursor się porusza. – user1340531

+2

@ user1340531 Jak napisali inni komentatorzy, musisz dodać ten kod do swojego pytania. – Inisheer

+1

Głównie dlatego, że nie ma czegoś takiego jak "globalne" wydarzenie MouseMove, chyba że zainstalowałeś globalny hak. –

0

Trudno powiedzieć tak mało informacji (może zrzut ekranu Twojego GUI pomogłoby) . Możesz spróbować:

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