Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Maus bewegung sehr langsam...
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

Maus bewegung sehr langsam...

beantworten | zitieren | melden

Hallo,

ich bin dabei eine kleine Anwendung oder eher ein kleines Spielchen zu schreiben. Zwischendurch muss die Anwendung die Maus willkürlich quer über den Screen fahren lassen.
Das ganze habe ich per Cursor.Position = ...; realisiert. Die Maus bewegt sich auch so wie ich es mir vorstelle, jedoch passiert das ganze extrem langsam. Man könnte dabei einschlafen... Ich habe das ganze vor kurzem bei einem Kollegen ausprobiert der 2 CPU's in seinem Rechner hat, da lief es bedeutend schneller. Ich habe, nebenbei bemerkt, ein Thread.sleep(1) zwischen dem Versetzen der Mausposition um einen Pixel eingebaut, noch weniger geht ja schließlich nicht. Nehme ich das sleep(1) raus passiert alles so schnell, dass man es gar nicht mehr sieht.
Der Cursor scheint eine heiß umkämpfte Resource zu sein und ich befürchte ich werde den Kampf gegen Windows mit den Mitteln die ich benutze immer verlieren.
Daher meine Frage ob jemand eine andere Methode kennt die das gewünschte liefert oder ob ich das ganze beschleunigen kann.

Gruß Hades
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Hallo Hades,

du musst den Pfeil ja nicht nur um einen Pixel verschieben.
Denn wenn du den direkt um 10 oder 20 verschiebst geht es schon viel schneller und es sieht trotzdem noch sehr flüssig aus.

Was verstehst du überhaupt unter ganz langsam? 10-20 sekunden, könnte ich mir da schon vorstellen (für den ganzen Bildschirm).

Denn Windows ist nicht echtzeitfähig.
Deshalb kannst du dir nie ganz sicher sein, dass Thread.Sleep genau eine Millisekunde dauert. AFAIK geht das nur auf eine Genauigkeit von 20ms, dadurch wird den Thread.Sleep oft bis zu 20 ms dauern obwohl du nur eine wolltest.

Gruss
Michael
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Hallo,

schonmal danke für die Antwort aber das ist nicht ganz das was ich mir als eine Lösung auf mein Problem vorgestellt habe. Man merkt dann doch recht deutlich das die Maus sich nicht wirklich Pixel für Pixel bewegt.

Hat vielleicht noch jemand eine Lösung für das problem? Also ich denke ich bräuchte eine Möglichkeit Windows eine Message zu schicken, die besagt, dass die Maus von Punkt A zu Punkt B bewegt werden soll, und zwar über alle Zwischenstationen...

Gruß Hades
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1.130
Herkunft: Norddeutschland

beantworten | zitieren | melden

Nimm einen Multimediatimer und miss die zeit mit ner Stopwatch. Multiplizier die Geschwindigkeit mit der Zeit ,die seit dem letzten Aufruf verstrichen ist, und der Richtung und addier das Ergebnis dann dann zur Mausposition.
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
JunkyXL
myCSharp.de - Experte

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1.665
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

Ich weiß nicht, ob es hilft. Aber verwende anstatt Thread.Sleep() die umgekehrte Variante mit dem System.Windows.Forms.Timer.
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Hi,

also deine Lösung klingt nicht schlecht floske.
Warum ein Timer jetzt etwas groß anderes als ein sleep sein soll weiß ich allerdings nicht, könntest du mir vielleicht kurz erklären warum das mein Problem löst?
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Hallo -Hades-
Zitat
Ich weiß nicht, ob es hilft. Aber verwende anstatt Thread.Sleep() die umgekehrte Variante mit dem System.Windows.Forms.Timer.
Der Timer ruft in einem Intervall eine bestimmte Methode auf.
Das ist die bessere Lösung als das Thread.Sleep zu verwenden, da das Thread.Sleep oft etwas komische Effekte haben kann.

In deinem Fall wirst du da wahrscheinlich keinen Unterschied merken.
Denn beim Thread.Sleep und beim Timer hast du das selbe Problem, dass Windows nicht echtzeitfähig ist und deshalb sieht das nicht sehr flüssig aus.

Hingegen der Lösungsvorschlag von Floste könnte das Problem wirklich lösen

Gruss
Michael
private Nachricht | Beiträge des Benutzers
-Hades-
myCSharp.de - Member



Dabei seit:
Beiträge: 171
Herkunft: Deutschland NRW

Themenstarter:

beantworten | zitieren | melden

Vielen dank für eure Antworten.
Also ich werde Floskes Lösung definitiv einbauen, das scheint mir eine sehr vernünftige Lösung. Allerdings habe ich gerade gesehen das es eine CursorSetPos methode in der user32.dll gibt. Hat jemand Erfahrung mit der Methode? Macht die dasselbe oder is diese vielleicht etwas besser geeignet?
private Nachricht | Beiträge des Benutzers
jaensen
myCSharp.de - Experte

Avatar #avatar-2657.png


Dabei seit:
Beiträge: 2.760
Herkunft: München

beantworten | zitieren | melden

Du könntest um eine realistischere Bewegung zu erhalten auch eine Beschleunigung einbauen.

Nach den ersten X pixeln wird die Maus x 1.1 schneller usw... bis zu einer gewissen Grenze und dann in 0.9 schritten wieder langsamer.
Das schaut schöner aus und ist auch schneller.

CursorSetPos -> MSND, PInvoke.net
private Nachricht | Beiträge des Benutzers