Autor Beitrag
JDA88
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  mouse_event(mouseeventf_leftdown, 0000);
  mouse_event(mouseeventf_leftup, 0000);
  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 user profile iconTino: Delphi-Tags hinzugefügt
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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



BeitragVerfasst: 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



BeitragVerfasst: Do 17.08.06 09:36 
So, hab mal etwas weiter gearbeitet:

ausblenden 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 //(global)
   x: boolean;

//on init     <- beim start des programms
   x := false;

//button    <- sobald button geklickt wird, wird var auf true gesetzt
begin
   x := true;
   close;
end;

//<form>
begin  
repeat 
   mouse_event(mouseeventf_leftdown, 0000);
   mouse_event(mouseeventf_leftup, 0000);
   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;


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 user profile iconGausi: Delphi-Tags hinzugefügt
Jinnay
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 70


Delphi 6
BeitragVerfasst: 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



BeitragVerfasst: Do 17.08.06 10:11 
user profile iconJinnay 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 17.08.06 10:25 
wie wäre es mit delphi tags ?
Jinnay
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 70


Delphi 6
BeitragVerfasst: Do 17.08.06 10:29 
So in etwa:

ausblenden 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, 0000);
  mouse_event(mouseeventf_leftup, 0000);
  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



BeitragVerfasst: Do 17.08.06 10:43 
user profile iconJinnay 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 70


Delphi 6
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 70


Delphi 6
BeitragVerfasst: 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



BeitragVerfasst: Do 17.08.06 11:15 
user profile iconJinnay 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 70


Delphi 6
BeitragVerfasst: Do 17.08.06 11:20 
Du musst natürlich unter OnTimer
ausblenden 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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;

ausblenden 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 :wink: ) 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Procedure TMyForm.Timer1Timer(Sender : TObJect);
Begin
  MyMausProzedur;
end;


und


ausblenden 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
BeitragVerfasst: 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,

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 70


Delphi 6
BeitragVerfasst: Do 17.08.06 13:05 
Ich hatte mir das einfach so gedacht, dass der Timer sich beim ersten Aufruf automatisch selbst deaktiviert :wink:
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Procedure MyForm.Timer1Timer(Sender: TObject);
Begin
  Timer1.Enabled:=False;  //Timer deaktivieren
  MyMausProzedur;         // Hier steht mein Code
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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)