Autor |
Beitrag |
Zottel von Urvieh
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 27.09.10 16:27
Ich hab (wer hätte das gedacht wenn ich hier schreibe?) ein Problem.
Ich möchte bzw habe ein Programm geschrieben, das die Mausbewegungen Invertiert.
Es funktioniert auch ohne Probleme, ABER:
Da ich um die Maus zu bewegen
Cursor.Position = new Point(x, y);
benutze, ruckeln die Mausbewegungen etwas. Vor allem wenn man sie schnell bewegt.
Meine Frage:
Gibt es eine Möglichkeit die Maus nicht wie bei Cursor.Position(x,y) auf diesen Punkt
springen zu lassen, sondern sie zu diesem Punkt wirklich zu bewegen?
Hab ordentlich danach gesucht, aber bisher leider noch nichts gefunden.
Ich hoffe ihr könnt mir helfen.
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 27.09.10 16:43
Ich nehme mal an, du hast eine Liste von Koordinaten. Nun könntest du überprüfen, ob die Differenz zweier benachbarter Koordinaten nicht zu groß ist. Und falls doch, dann einfach entsprechende Zwischenpunkte einfügen (mittels linearer Interpolation oder falls es noch schöner aussehen soll (rundere Bewegungen) mittels Spline-Berechnung).
|
|
Zottel von Urvieh
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 27.09.10 17:29
Hmm... hab das grade mal eingebaut... macht das zwar schon ein bisschen besser, aber lange nicht perfekt. (selbst wenn man mehrere Zwischenpunkte einfügt) Irgendwie noch nicht die sauberste Lösung.
Ich hoffe ja eigentlich, dass es sowas wie Cursor.MoveTo(x,y,geschwindigkeit) gibt. Sollte es doch geben oder?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 27.09.10 19:15
Bei mir ist mit
C#-Quelltext 1: 2: 3: 4: 5:
| for (int i = 0; i < 1000; i++) { Cursor.Position = new Point(i, (int)(100 * (Math.Sin(i / 100.0) + 1))); Thread.Sleep(millisecondsTimeout: 5); } | die Bewegung perfekt flüssig. Da hast du wohl noch zu wenig interpoliert.
_________________ >λ=
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Di 28.09.10 10:45
Hallo,
ich denke so einfach ist es nicht.
Ich nehme an er will die aktuelle Mausbewegungen invertieren. Sprich bei einer Schleife mit 1000 Durchläufe und einem Sleep von 5ms pro Durchlauf sind das 5 Sekunden und das wäre dann schon ne arge Verzögerung.
Ich denke eine Zwischenlösung ist das Richtige. In der der zu hinterlegende Strecke der Maus berechnet und dann eine gewisse Anzahl von Zwischenschritten durchführt. Wie viele das genau sind würde ich durch ein kleines Testform näherungsweise ausprobieren. Auch sollte man zwischenzeitliche Änderungen der Maus wieder neu in die Routine reinberechnen. Ich denke nur so wäre ein realistisches Verhalten umsetzbar.
Gruß
|
|
Zottel von Urvieh
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 29.09.10 13:53
Hey!
Ich habe herausgefunden, wieso mein Mauszeiger ruckelt! Das war nur ein doofer Code Fehler, den ich irgendwie nicht bemerkt hab. Mein vollständiger Code um die momentane Bewegung der Maus zu invertieren sieht jetzt folgendermaßen aus, und funktioniert wunderbar flüssig (auch ohne Zwischenpunkte):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| using System.Drawing; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int x1, x2, y1, y2; bool boolvariable = false;
private void Form1_MouseMove(object sender, MouseEventArgs e) { if (boolvariable == false) { x1 = MousePosition.X; y1 = MousePosition.Y; boolvariable = true; } else { x2 = MousePosition.X; y2 = MousePosition.Y; x1 = x1 - (x2 - x1); y1 = y1 - (y2 - y1); Cursor.Position = new Point(x1, y1); boolvariable = false; } } } } |
Dumm wie ich bin, hab ich außerhalb von if-else auch noch mal boolvariable = false geschrieben.
*Kopf gegen die Wand hau*
Das ist mir die ganze Zeit nicht aufgefallen, da mein eigendliches Programm noch mehr macht...
Naja trotzdem danke für eure Hilfe.
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 29.09.10 14:13
Jetzt weiß ich endlich, was du mit "invertieren" meinst (also nur das relative Vorzeichen umdrehen, und nicht das Anzeigen einer gespeicherten Mausbewegung)...
Trotzdem sieht dein Code irgendwie nicht richtig aus, insbesondere das Zurücksetzen von 'boolvariable = false;'.
Und die Berechnung kannst du auch verkürzen zu:
C#-Quelltext 1: 2:
| x1 -= (x2 - x1); y1 -= (y2 - y1); |
|
|
Zottel von Urvieh
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 29.09.10 14:57
joh... die Rechnung könnt man wirklich kürzer machen, aber der Rest ist doch so in Ordnung. Oder geht das noch einfacher?
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 29.09.10 15:38
Also die Rechnung kann man bestimmt nicht verkürzen, höchstens kürzer Schreiben. Aber in diesem Fall würde ich Lesbarkeit bevorzugen. Dies gilt übrigens für den ganzen Code.
Eine Variable Namens boolvariable sagt nämlich überhaupt nichts aus. Des weiterem ist ein Vergleich einer Variable mit == false extrem unüblich. Da würde ich eher die Kurzform !boolvariable empfehlen (natürlich mit einem sinnvollen Namen!). Ich nehme an es wäre InvertMouse.
x2 = MousePosition.X; macht auch nicht wirklich Sinn.. außer das man zwei Zeilen tiefer oben immer schauen muss was nun x2 wieder war.
x1/y1 ist auch unglücklich gewählt.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void Form1_MouseMove(object sender, MouseEventArgs e) { if (lastMousePosition != null && InvertMouse) { Cursor.Position = new Point(2 * lastMousePosition.X - MousePosition.X, 2 * lastMousePosition.Y - MousePosition.Y); }
lastMousePosition = new Point(MousePosition.X, MousePosition.Y); InvertMouse = !InvertMouse;
} |
Gruß
|
|