2010-07-29 10 views
0

J'ai une application graphique dans laquelle je déplace un objet graphique avec la souris.Arrêter ou déplacer la souris

Dans certaines conditions, l'objet s'arrête de bouger. Je dois alors arrêter de déplacer le curseur de la souris aussi.

Est-ce possible? Propriété MousePosition semble être en ReadOnly.

Par exemple.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.X > 100) 
     { 
      Cursor.Position = new Point(100, Cursor.Position.Y); 
     } 
    } 
} 

EDIT, deuxième version, fonctionne, mais le curseur est pas "stable" - vacillante:

private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.X > 100) 
     { 
      Point mousePosition = this.PointToClient(Cursor.Position); 
      mousePosition.X = 100; 
      Point newScreenPosition = this.PointToScreen(mousePosition); 
      Cursor.Position = newScreenPosition; 
     } 
    } 
+0

Vous pouvez remplacer ce code avec un seul appel à ClipCursor, où le rectangle est '{0, 0, 100, Form.Height}' (converti des coordonnées du client aux coordonnées de l'écran, évidemment). – GSerg

Répondre

3

Vous pouvez utiliser la fonction ClipCursor via PInvoke. Si le rectangle est assez petit, la souris ne bougera pas.


EDIT

Un exemple:

[StructLayout(LayoutKind.Sequential, Pack=1)] 
public struct RECT { 
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 
}; 


public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    [DllImport("user32.dll")] 
    static extern bool ClipCursor([In()]ref RECT lpRect); 

    [DllImport("user32.dll")] 
    static extern bool ClipCursor([In()]IntPtr lpRect); 


    private bool locked = false; 

    private void button1_Click(object sender, EventArgs e) 
    { 

     if (locked) { 
      ClipCursor(IntPtr.Zero); 
     } 
     else { 
      RECT r; 

      Rectangle t = new Rectangle(0, 0, 100, this.ClientSize.Height); 
      t = this.RectangleToScreen(t); 

      r.left = t.Left; 
      r.top = t.Top; 
      r.bottom = t.Bottom; 
      r.right = t.Right; 

      ClipCursor(ref r); 
     } 

     locked = !locked; 

    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
} 
+0

e .. quelle est l'utilisation dans. NET? – serhio

+0

que voulez-vous dire "assez petit"? et sinon? – serhio

+0

Les déclarations .net pour C# et vb se trouvent en bas de cet article. – GSerg

2

Avez-vous essayé d'utiliser Cursor.Position?

E.g.

Cursor.Position = new Point(100, 100); 

Vous pouvez continuer à le définir sur une valeur constante (comme dit Vulcan).

+0

Bien! Je n'étais pas au courant de cela. –

+0

J'utilise OnMouseMove e Comme System.Windows.Forms.MouseEventArgs et semble que e.Location n'est pas synchronisé avec Cursor.Position ... Aussi j'ai curseur visible "feedback" lors de l'utilisation ... – serhio

+0

@serhio ... comment est-il hors-synchronisation? – NickAldwin

Questions connexes