Autor |
Beitrag |
Sneap
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 20.07.10 22:43
Hallo Leute,
wie der Titel schon sagt hab ich ein paar Probleme den Mauszeiger zu bewegen und zwar bewegt sich dieser immer unterschiedlich schnell mal so schnell das man ihn kaum sieht und mal ziemlich langsam.
Hier mal der Code dazu:
Delphi-Quelltext 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:
| while z < strtoint(edit_anzahl1.Text) do begin SetCursorPos(x_start, y_start); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
while(x_start < x_end)or(y_start < y_end) do begin if ((GetAsyncKeyState(VK_ESCAPE) and $8001) <> 0) then begin x_start := x_end; y_start := y_end; z := strtoint(edit_anzahl1.Text); end; if x_start < x_end then x_start := x_start+1; if y_start < y_end then y_start := y_start+1; SetCursorPos(x_start, y_start); Application.ProcessMessages; end; mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); z := z+1; x_start := x_start1; y_start := y_start1; Application.ProcessMessages; sleep(strtoint(edit_wait.Text)); end; |
Weiß jemand vll wo drann das liegt bzw wie ich es hinbekomme das die Maus immer flüssig bewegt wird?
Danke schon mal für eure Hilfe.
Mfg Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 21.07.2010 um 02:36
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 20.07.10 22:46
Hallo und
Ich sehe nirgends, dass du eine Zeitangabe nutzt, dementsprechend ist die Bewegung eben nicht von der Zeit sondern von der Ausführungsgeschwindigkeit deines Codes abhängig.
Wenn du eine bestimmte Geschwindigkeit möchtest, musst du auch die Bewegung von der Zeit abhängig machen. Indem du zum Beispiel die aktuelle Position in Abhängigkeit von der vergangenen Zeit berechnest.
|
|
Sneap 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 20.07.10 23:35
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ich dachte sleep würde dafür reichen.
Wie mach ich das am besten, soll ich mir dann mit TDateTime die Uhrzeit hollen und damit rechnen oder gibts da vll ne einfachere Methode?
|
|
jaenicke
      
Beiträge: 19322
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 20.07.10 23:43
Ich würde eher GetTickCount benutzen, das zählt in Millisekunden.
Sleep pausiert für eine Zeitspanne von einigen Millisekunden, aber du weißt eben nicht, ob es 15 oder 50 Millisekunden sind, je nach PC und Rechnerauslastung. Weniger als 15-25 Millisekunden ist gar nicht möglich.
Deshalb kannst du dich nicht darauf verlassen, dass eine Pause eine bestimmte Zeit dauert, sondern musst die aktuelle Position in Abhängigkeit von der Zeit berechnen. Dann ruckelt es nur, wenn durch hohe Rechnerauslastung es mal länger bis zum nächsten Positionswechsel dauert, aber die Geschwindigkeit bleibt gleich.
Für die Berechnung der vergangenen Zeit bietet sich wie gesagt GetTickCount an.
|
|
Sneap 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 21.07.10 00:19
Meinst du in ungefär so:
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:
| while(x_start < x_end)or(y_start < y_end) do begin if ((GetAsyncKeyState(VK_ESCAPE) and $8001) <> 0) then begin x_start := x_end; y_start := y_end; z := strtoint(edit_anzahl1.Text); end; if x_start < x_end then x_start := x_start+1; if y_start < y_end then y_start := y_start+1; SetCursorPos(x_start, y_start); time_start := GetTickCount; time_end := GetTickCount + strtoint(edit_speed.Text); while time_start < time_end do begin time_start := GetTickCount; end; end; mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); z := z+1; x_start := x_start1; y_start := y_start1;
Application.ProcessMessages; time_start := GetTickCount; time_end := GetTickCount + strtoint(edit_wait.Text); while time_start < time_end do begin time_start := GetTickCount; end; end; | Das läuft so zwar besser aber die Maus ist dafür jetzt verdammt lahm egal wie klein ich den Wert auch mache...
|
|
Sneap 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 21.07.10 09:24
So Leute hab mir jetzt ne kleine funktion geschrieben die so aussieht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure pause(zeit:longint); var zeit1:longint; begin zeit1 := GetTickCount; repeat application.ProcessMessages; until (GetTickCount-zeit1 > zeit); end; |
Das einzigste Problem is das die Maus selbst wenn ich pause(1) mache, immer noch recht lahm ist normal müste sie doch dann flitzen ohne ende aber Sie tuts nicht.Wäre super wenn mir da vll noch jemand sagen könnte wies am besten wäre...
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Mi 21.07.10 09:44
Moin ...,
mach mal das Delphi-Quelltext 1:
| Application.ProcessMessages | raus oder steuere das zumindest gezielt, zb. nur jeder 10. Mausschritt wird Rechenzeit freigegeben.
In der Procedure Pause hat das garnix zu suchen sonst könntest du da gleich mit Zufallszeiten arbeiten.
LG Mario
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mi 21.07.10 09:56
Ich würde es andersrum angehen. Vergiss die Sache mit der Pause erst mal.
Berechne, um wie viele Pixel sich der Mauszeiger verschoben haben müsste (anhand gewünschter Geschwindigkeit und vergangener Zeit) und verschiebe den Mauszeiger dann um diese Strecke.
Dann kann die Pause so lang oder kurz sein, wie sie will. Der Mauszeiger ist immer gleich schnell. Wenn der PC mit andere Dingen beschäftigt ist, würde der Mauszeiger halt anfangen zu ruckeln/hüpfen, aber die Geschwindigkeit stimmt trotzdem.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Sneap 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 21.07.10 10:20
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Mi 21.07.10 10:26
Ich war der Meinung er wollte den Mauszeiger schrittweise bewegen und während des verschiebens zuschauen
Wie es Nersgatt beschrieben hat gehts natürlich auch.
Delphi-Quelltext 1: 2: 3: 4: 5:
| var MyMouse: TPoint; MyMouse:= Mouse.CursorPos; MyMouse.y:= MyMouse.y + StrToInt(edit_anzahl1.Text); SetCursorPos(MyMouse.x, MyMouse.y); |
Der TE braucht aber lediglich die Pixel von edit_anzahl1.Text zum aktuellen Mausbreich summieren und vielleicht noch prüfen ob sich der Bereich innerhalb des Bildschrims befindet.
|
|
Sneap 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 21.07.10 11:00
Habs jetzt so, aber dann verschwindet die Maus immer ins Bodenlose:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure mouse_move(speed:string;y_end:integer); var MyMouse: TPoint; begin MyMouse:= Mouse.CursorPos; MyMouse.y:= MyMouse.y + StrToInt(speed); if MyMouse.y < y_end then SetCursorPos(MyMouse.x, MyMouse.y); end;
while(x_start < x_end)or(y_start < y_end) do begin mouse_move(edit_speed.Text,y_end); end; |
So wie es aussieht stimmt was nicht ganz mit dem Wo sie aufhören soll, nur iwi bin ich gerade n bisel durchen wind um den Fehler zu sehn.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 21.07.10 21:12
jaenicke hat folgendes geschrieben : | ...Sleep pausiert für eine Zeitspanne von einigen Millisekunden, aber du weißt eben nicht, ob es 15 oder 50 Millisekunden sind, je nach PC und Rechnerauslastung. Weniger als 15-25 Millisekunden ist gar nicht möglich...
Deshalb kannst du dich nicht darauf verlassen, dass eine Pause eine bestimmte Zeit dauert, sondern musst die aktuelle Position in Abhängigkeit von der Zeit berechnen. Dann ruckelt es nur, wenn durch hohe Rechnerauslastung es mal länger bis zum nächsten Positionswechsel dauert, aber die Geschwindigkeit bleibt gleich.
Für die Berechnung der vergangenen Zeit bietet sich wie gesagt GetTickCount an. |
Seit WINDOWS 7 64Bit sollte so etwas niemand mehr schreiben!
|
|
Hobby-Programmierer
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: Mi 21.07.10 21:25
Hast du selber begriffen was du da geschrieben hast?
Für was zum Geier gibt es die Konstante Speed und warum ist das ein String?
Du addierst die Y-Koordinate mit Speed und prüfst dann ob das kleiner als y_end ist. Wie berechnest du denn y_end?
|
|
Gausi
      
Beiträge: 8549
Erhaltene Danke: 478
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 22.07.10 07:51
hathor hat folgendes geschrieben : | Seit WINDOWS 7 64Bit sollte so etwas niemand mehr schreiben! |
Und warum nicht? was hat sich denn in Windows 7 in der Richtung getan? Und warum gilt das dann nicht für die 32-Bit-Version?
_________________ We are, we were and will not be.
|
|
Sneap 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 22.07.10 09:31
Hobby-Programmierer hat folgendes geschrieben : |
Hast du selber begriffen was du da geschrieben hast?
Für was zum Geier gibt es die Konstante Speed und warum ist das ein String?
Du addierst die Y-Koordinate mit Speed und prüfst dann ob das kleiner als y_end ist. Wie berechnest du denn y_end? |
y_end holle ich mir vorher das ist kein Problem.
Speed steht in ner edit.
Aber hab das Problem jetzt anders gelöst, ich brauchte die Maus für das vorhaben nicht bewegen sondern es reicht wenn ich sie von Start xy nach End xy Springen lasse und dann eine Pause einlege.
|
|