Autor |
Beitrag |
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.06 21:07
Nabend!
Ich versuche gerade ein Programm zu erstellen, welches abwechselnd die linke Maustaste sowie die W Taste drückt...
Bin nun schon so weit gekommen das die Prozedur für die Tastenklicks fehlerfrei läuft:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| begin mouse_event(mouseeventf_leftdown, 0, 0, 0, 0); mouse_event(mouseeventf_leftup, 0, 0, 0, 0); keybd_event(vk_shift,0,0,0); keybd_event(ord('W'),0,0,0); keybd_event(ord('W'),0,keyeventf_keyup,0); keybd_event(vk_shift,0,keyeventf_keyup,0); end; |
Nun habe ich versucht das in einen Timer zu programmieren, sodass die Eingaben erst nach z.B. 10 Sekunden erfolgen! Hab noch nie mit nem Timer gearbeitet, von daher bin ich da etwas ratlos wie ich das programmieren muss! Ausserdem soll das Programm die Tastenklicks anschliessend solange ausführen, bis ein Button "Beenden" angeklickt wird. Hab mir gedacht das mit ner Repeat/Until-Schleife zu lösen (so in der Art: repeat ... until button1.click = true), wollte aber nicht ganz funktionieren!
Danke im Vorraus!
MfG JDA88
Moderiert von Tino: Delphi-Tags hinzugefügt
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 16.08.06 21:47
am besten macht man sowas via treiber programmierung, da das mit delphi net geht, muss man als delphianer halt auf vorhande software zurückgreifen und das wäre in deinem Fall Autohotkey
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.06 22:09
Es reicht ja auch erstmal wenn die Funtionen nur im Programm ansich funktionieren würde und nicht das ich z.B. das Programm öffne und das Abwechseln von linker Maustaste und W Taste auf Windows oder andere Programme anwende. Hoffe das ich mich einigermaßen verständlich ausgedrückt habe was ich möchte 
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.08.06 09:36
So, hab mal etwas weiter gearbeitet:
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:
| var x: boolean;
x := false;
begin x := true; close; end;
begin repeat mouse_event(mouseeventf_leftdown, 0, 0, 0, 0); mouse_event(mouseeventf_leftup, 0, 0, 0, 0); keybd_event(vk_shift,0,0,0); keybd_event(ord('W'),0,0,0); keybd_event(ord('W'),0,keyeventf_keyup,0); keybd_event(vk_shift,0,keyeventf_keyup,0); until x = true; end; |
So in der Art müsste das eigentlich laufen, nun möchte ich nur gerne die Prozedur die sich bei mir noch in der Form befindet in einen Timer programmieren, sodass die Prozedur erst nach etwas 10 Sekunden gestartet wird! Bitte um Lösungsansätze!
MfG JDA88
Moderiert von Gausi: Delphi-Tags hinzugefügt
|
|
Jinnay
      
Beiträge: 70
Delphi 6
|
Verfasst: Do 17.08.06 09:46
Wie wäre es mit einer einfachen TTimer Komponente mit einem Intervall von 10s die sich beim ersten Ereigniss deaktiviert und die Prozedur startet?
Ich hab auch irgendwo ein Programm gesehen das Eingaben simuliert, auch Mausbewegungen etc..
Hatte zwar ein paar kleine Fehler im Quelltext, aber sonst recht fein... würd einfach mal bei google suchen falls es interessiert.
Oder ich ladt es bei Gelegenheit mal hoch...
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.08.06 10:11
Jinnay hat folgendes geschrieben: | Wie wäre es mit einer einfachen TTimer Komponente mit einem Intervall von 10s die sich beim ersten Ereigniss deaktiviert und die Prozedur startet?
|
Wie würde der Quelltext dann ungefähr aussehen?
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 17.08.06 10:25
wie wäre es mit delphi tags ?
|
|
Jinnay
      
Beiträge: 70
Delphi 6
|
Verfasst: Do 17.08.06 10:29
So in etwa:
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:
| <var (global)> x: boolean;
<on init> <- beim start des programms x := false; Timer.Interval:= 100000 Timer.Enabled := true
<button> <- sobald button geklickt wird, wird var auf true gesetzt begin x := true; close; end;
<on timer> <- also nach 10 sec begin repeat mouse_event(mouseeventf_leftdown, 0, 0, 0, 0); mouse_event(mouseeventf_leftup, 0, 0, 0, 0); keybd_event(vk_shift,0,0,0); keybd_event(ord('W'),0,0,0); keybd_event(ord('W'),0,keyeventf_keyup,0); keybd_event(vk_shift,0,keyeventf_keyup,0); until x = true; <- prozedur wird beendet da var im button auf true gesetzt wurde end; |
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.08.06 10:43
Jinnay hat folgendes geschrieben: |
<on timer> <- also nach 10 sec
|
Die Funktion heisst on timer? also ich muss nicht den Timer doppelt anklicken und die Prozedur dort reinschreiben?
|
|
Jinnay
      
Beiträge: 70
Delphi 6
|
Verfasst: Do 17.08.06 10:51
Nein, OnTimer ist das Ereignis.
Ich würde den Interval schon zu Begin setzen und nicht erst in der Laufzeit, außerdem musst du Timer.enabled auf false setzen.
und dann halt unter Ereignisse Doppelklick auf OnTimer...
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.08.06 10:54
<on init> <- beim start des programms
x := false;
Timer.Interval:= 100000
Timer.Enabled := true <- Du meinst den auf False setzen?
und nach 10 Sekunden setzt das Programm den
Timer auf True oder verstehe ich das falsch?
|
|
Jinnay
      
Beiträge: 70
Delphi 6
|
Verfasst: Do 17.08.06 11:00
Du musst einfach nur in der Entwicklung, also wenn du die Komponente auf der Form plazierst, den Intervall auf 100000 setzen, dann kannst du auch den Timer.enabled := true weglassen.
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.08.06 11:15
Jinnay hat folgendes geschrieben: | Du musst einfach nur in der Entwicklung, also wenn du die Komponente auf der Form plazierst, den Intervall auf 100000 setzen, dann kannst du auch den Timer.enabled := true weglassen. |
OK! Aber eine Frage hab ich noch... Die Funktion heisst ja Intervall und darunter verstehe ich, dass etwas in bestimmten Zeitabständen immer wieder ausgeführt wird. Ich möchte ja aber nur, dass ich nachher ne exe starten kann, 10 sekunden vergehen und dann die Prozedur mit den Tastatur-/Mauseingaben solange läuft bis ich nen Button zum schliessen anklicke!
|
|
Jinnay
      
Beiträge: 70
Delphi 6
|
Verfasst: Do 17.08.06 11:20
Du musst natürlich unter OnTimer
Delphi-Quelltext 1:
| Timer.enabled := False; |
setzen damit er es nur ein mal macht.
Hatte ich vergessen zu schreiben, sorry.
|
|
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 17.08.06 11:27
OK, ich werd mich heut abend mal dran versuchen wenn ich von der Arbeit wieder Zuhause bin. Soweit erstmal vielen Dank für die Hilfe! Wenns nicht klappen sollte melde ich mich nochmal zu Wort
MfG JDA88
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Do 17.08.06 12:53
Titel: onTimer-Ereignis
Hi
ok, Leute, ich glaub, da versteht ihr etwas falsch. Ein OnTimer-Ereignis ist ein Ereignis, welches alle Intervall-Zeiten 1 mal aufgerufen wird. Kleinster Intervall ist 1 ms, das heißt 1000 ist 1 sek und 10000 ist alle 10 sek. In die OnTimer-Routine packe ich den Aufruf der Procedure, die meinen Code ausführt. Also, den Aufruf um die MouseEvents zu setzen.
Timer1.enabled:=True heisst nix anderes, er darf alle 10 sek (oder eingestellte Intevallzeit) sein OnTimer-Ereignis aufrufen, Timer1.Enabled:=False heisst: mach nix !
Also, der Timer ist im Prinzip der Finger, der alle 10 sek 1mal auf das knöpfchen drückt, wenn er es darf.
Du mußt dir nur global merken, was hab ich zuletzt gemacht und in deiner Procedure entsprechend darauf reagieren. Das geht z.B. mit Boolean-Variablen.
Mein Vorschlag:
In der ButtonClick-Methode setzt oder sperrst du nur den Timer;
Delphi-Quelltext 1: 2: 3: 4:
| Procedure TMyForm.MyStartStopButtonclick(Sender: TObject); begin If Timer.Enabled then timer.Enabled:=False else Timer.Enabled:=True; end; |
Mehr brauchts nicht, um dieses (dämliche  ) clicken zu unterbinden.
Nun benötigst du noch eine globale Boolean, die dir sagt, ich hab zuletzt rechts gedrückt oder nicht(z.B. dein x, obwohl ich Variablennamen schon etwas größer machen würde und Boolean eher mit Flag benenne, also myFlag, MausFlag, RechtsFlag etc.). Das wertest du in deiner eigenen Procedure aus und setzt deine MouseEvents entsprechend.
Und diese Procedure rufst du in der onTimer_Procedure auf.
Delphi-Quelltext 1: 2: 3: 4:
| Procedure TMyForm.Timer1Timer(Sender : TObJect); Begin MyMausProzedur; end; |
und
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Procedure TMyForm.MyMausProzedur; Begin ........ hier steht dein Code, der Intervallmäßig bearbeitet werden soll ........ end; |
Fertig, mehr braucht's nicht.
Ich hoffe gehelft zu haben.
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
Zuletzt bearbeitet von oldmax am Do 17.08.06 13:05, insgesamt 1-mal bearbeitet
|
|
danis`
Hält's aus hier
Beiträge: 7
Win 2000, WinXP
Delphi 7, C/AL, PHP
|
Verfasst: Do 17.08.06 12:55
Ich würd an deiner Stelle keine Repeat Schleife in den Timer packen,
und warum?
Ich weiss nicht genau ob die Schleife nach dem TimerRefresh (der ja alle x sek kommt) abgebrochen wird oder weiter läuft,
also ist es total sinnfrei ne schleife zu nehmen
Es ist doch viel simpler wenn du in den Timer ne kleine if abfrage packst,
Delphi-Quelltext 1: 2: 3:
| if x = true then Timer1.enabled := false; |
Ich denk mal so würds viel einfacher und, wenn ich richtig liege,
mit weniger Prozessorauslastung lösbar sein.
|
|
Jinnay
      
Beiträge: 70
Delphi 6
|
Verfasst: Do 17.08.06 13:05
Ich hatte mir das einfach so gedacht, dass der Timer sich beim ersten Aufruf automatisch selbst deaktiviert 
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: Do 17.08.06 13:21
Titel: Immer noch Timer...
Hi
Ich noch mal, hab grad meinen Irrtum gesehen, aber es ist ja noch einfacher.
Da ein Timer von hause aus Enabled ist, brauchts einfach nur die 10 sek abwarten, dann trifft ja das Timerereignis ein.
Delphi-Quelltext 1: 2: 3: 4: 5:
| Procedure MyForm.Timer1Timer(Sender: TObject); Begin Timer1.Enabled:=False; MyMausProzedur; end; |
Und in dieser myMausProzedur kann ich nun mit meiner Repeatschleife bis Abbruchbedingung bleiben....
Aber mal ne Frage, wen möchtest du denn damit ärgern..... ??!!
Gruß oldmax
_________________ Zier dich nich so, ich krieg dich schon....
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 21.08.06 18:57
Fehler von mir. Bitte löschen :-/.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
|