Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Stelle Fragen zur Automatisierung von Spielen

Moderator: jNizM

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 26 Dec 2021, 19:11

Hallo,

ich möchte das die Taste E für 10 Sekunden gedrückt wird, danach losgelassen wird und dann wieder für 10 Sekunden gedrückt wird in einem Spiel. Aber es klappt irgendwie nicht, was mache Ich falsch? Danke im voraus für jede Hilfe

Code: Select all

$F4::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
	Send {e down}
	Sleep 1000
	Send {e up}
}
return

Rohwedder
Posts: 7555
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by Rohwedder » 27 Dec 2021, 03:28

Hallo,
Versuchs mal. Die zwei Töne sind nur zum Testen.

Code: Select all

#MaxThreadsPerHotkey 2
$F4::
#MaxThreadsPerHotkey 1
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
	Send {e down}
	SoundBeep, 4000, 20 ; Piep
	Sleep 10000 ;10 Sekunden
	Send {e up}
	SoundBeep, 1000, 20 ; Puup
}
return
oder besser mit einem Timer:

Code: Select all

$F4::
IF (toggle:=!toggle) ; EIn-/Aus-Schalter
{
	SetTimer, TF4, 10000 ; 10 Sekunden
	Send {e down}
	SoundBeep, 4000, 20 ; Piep
}
Else
{
	SetTimer, TF4, Off
	Send {e up}
	SoundBeep, 1000, 20 ; Puup
}
Return
TF4:
	Send {e up}
	SoundBeep, 1000, 20 ; Puup
	Send {e down}
	SoundBeep, 4000, 20 ; Piep
Return

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 27 Dec 2021, 06:37

Ich hab das untere Script genommen mit dem Timer, beim ersten mal Drücken der F4 Taste hält er E gedrückt im Spiel und macht das was es soll aber wenn die Runde zuende ist und erneut E gedrückt werden muss kommt zwar ein Beep Ton aber im Spiel passiert nichts..

Rohwedder
Posts: 7555
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by Rohwedder » 27 Dec 2021, 06:51

Entweder, das Spielefenster ist nicht mehr aktiv, der Send-Befehl sendet nur an das jeweils aktive Fenster, oder das Spiel weigert sich die Sendung anzunehmen.
Einem ControlSend kann mittels Steuerelement, Fenstertitel … eine Sendeadresse übergeben werden.
https://ahkde.github.io/docs/commands/ControlSend.htm

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 27 Dec 2021, 07:06

Damit kenne Ich mich halt absolut garnicht aus, wollte nur ein kleines Script haben um eine vereinfachung in einem Spiel zu haben.

Habs aber mittlerweile denk ich mal hinbekommen:

Code: Select all

$F8::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
	SendInput {e down}
	Sleep 15000
	SendInput {e up}
	Sleep 1000

}
return
Denke ich bisher funzt es.

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 27 Dec 2021, 12:54

Also ich bräuchte doch mal Hilfe... irgendwie Buggt das im Spiel nach einigen Minuten rum... manchmal geht der Toggle auch weiter und hört nicht auf, an was kann das liegen?

Code: Select all

F8::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
	SendInput {e down}
	Sleep 15000
	SendInput {e up}
	Sleep 1000

}
return
Er soll 15 Sekunden E halten danach Loslassen und dann E wieder halten für 15 Sekunden. Wie funktioniert das richtig?

Rohwedder
Posts: 7555
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by Rohwedder » 27 Dec 2021, 13:37

Versuche mal dieses hier:

Code: Select all

*F4::
toggle := !toggle
SetTimer, TF4, -10
Return
TF4:
SendInput {e up}
Sleep 1000
IF toggle
{
	SetTimer, TF4, 16000 ; alle 16 Sekunden
	SendInput {e down}
}
Else
{
	SetTimer, TF4, Off
	SendInput {e up}
}
Return
und evtl. dazu als 2. Skript, um den Zustand der E-Taste zu sehen:

Code: Select all

#Persistent
SetTimer,State,200,Keys:="e"
State: ;Keys separated with space or tab
For all,Key in StrSplit(Keys,[A_Space,A_Tab])
	Text.=Trim(Key)>""?"`n" Key "`t" (GetKeyState(Key)?"down":"up"):
MouseGetPos, MX, MY ;separated from another ToolTip
ToolTip,% SubStr(Text,2),MX+16,MY+32,4,Text:=""
Return

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 27 Dec 2021, 17:16

Es funktioniert, richtig nice! Vielen Dank habe die Codes untereinander einfach gepackt. Er hält E gedrückt 16 Sek. danach hört er auf und drückt wieder. Drücke ich wieder F4 macht er aus.Danke!!!

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 29 Dec 2021, 20:50

@Rohwedder

Es funktioniert zwar gut aber wenn man es eine weile durchlaufen lässt z.b. so 20-30 Minuten und dann die Taste F4 erneut drückt damit er aufhört, hört er aber nicht auf... und die ganze Tastatur fängt dann an zu spacken dann muss ich STRG+ALT+ENTF drücken damits wieder komplett aufhört. Mit F2 kill ich die hotkey.exe aber er hört da trotzdem nicht auf...

Hier ist mal mein gesamtes Script. Ist da irgendwas drin was diese Schleife auslöst?

Code: Select all

F2:: 
SoundBeep
ExitApp	
return

#IfWinActive, ahk_exe GTA5.exe
toggle = 0
#MaxThreadsPerHotkey 2


;Letzte große Änderung: Alle $ vor dem Befehl entfernt

LCtrl & F1:: 
Runwait, taskkill /im GTA5.exe /f
Run, "C:\Program Files\Rockstar Games\GTA V"
return
 
$F6::
Toggle := !Toggle
While Toggle
{
Send {w Down}
Sleep, 50
}
Send {w up}
return


$F7::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
SendInput {1}{w}
Sleep, 500
}
return


$NumpadAdd::
Toggle := !Toggle
While Toggle
{
SendInput, {Space Down}
SendInput, {w Down}
Sleep, 50
}
SendInput, {Space up}
SendInput, {w up}
return

$F3::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
SendInput {e down}
Sleep 14000
SendInput {e up}
Sleep 1000
}
return


#IfWinActive

; ALLTE SCRIPTS
; ----------------------------------------------------------------------

Rohwedder
Posts: 7555
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by Rohwedder » 30 Dec 2021, 05:56

Da kein F4-Hotkey vorhanden ist, sollte F4 im Skript nichts bewirken. Ist wohl doch nicht das gesamte Script?

Du verwendest

Code: Select all

#MaxThreadsPerHotkey 2
und danach mehrere per Hotkey ein/aus geschaltete Schleifen wie:

Code: Select all

$F6::
Toggle := !Toggle
While Toggle
{
	Send {w Down}
	Sleep, 50
}
Send {w up}
return
wobei alle Schleifen (und mein F4-Timer) dieselbe Variable Toggle verwenden. Ob Letzteres sinnvoll ist, mußt du wissen!
In Autohotkey_L kann nur jeweils ein einziger Thread aktiv sein.
Läuft z.B. gerade die Whileschleife vom $F6::-Thread und du drückst schnell F7 und F6, passiert:
Der neue $F7::-Thread schickt den $F6::-Thread auf die Wartebank und schaltet Toggle auf False.
Bevor er sich jedoch beenden kann, startet ein zweiter $F6::-Thread welcher Toggle auf True setzt und den $F7::-Thread auf die Wartebank geschickt.
Jetzt existieren zwei $F6::-Threads, ein aktiver und einer auf der Wartebank,
die Schwelle von #MaxThreadsPerHotkey 2 ist für $F6:: erreicht und das Skript wird blind für den Hotkey $F6::.
Abhilfe: #MaxThreadsPerHotkey 3.

Damit dein F2-Notaus besser funktioniert, verwende:

Code: Select all

*F2::ExitApp

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 30 Dec 2021, 13:51

Hab es jetzt so ganz oben korrigiert:

Code: Select all

*F2::ExitApp

#IfWinActive, ahk_exe GTA5.exe
toggle = 0
#MaxThreadsPerHotkey 3


;Letzte große Änderung: Alle $ vor dem Befehl entfernt

LCtrl & F1:: 
Runwait, taskkill /im GTA5.exe /f
Run, "C:\Program Files\Rockstar Games\GTA V"
return
 
$F6::
Toggle := !Toggle
While Toggle
{
Send {w Down}
Sleep, 50
}
Send {w up}
return


$F7::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
SendInput {1}{w}
Sleep, 500
}
return


$NumpadAdd::
Toggle := !Toggle
While Toggle
{
SendInput, {Space Down}
SendInput, {w Down}
Sleep, 50
}
SendInput, {Space up}
SendInput, {w up}
return

$F3::
toggle := !toggle		; EIn-/Aus-Schalter
while toggle
{
SendInput {e down}
Sleep 14000
SendInput {e up}
Sleep 1000
}
return


#IfWinActive

; ALLTE SCRIPTS
; ----------------------------------------------------------------------

Werde es mal testen und Berichten vielen Dank. Ggf. bezahl Ich gerne ein Porto für die ganze Hilfe.

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 02 Jan 2022, 12:05

Irgendwas läuft da immernoch nicht richtig... nach langer Zeit wenn ich F3 wieder drücke damit er aufhört macht er einfach weiter... an was kann das liegen?

Rohwedder
Posts: 7555
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by Rohwedder » 03 Jan 2022, 03:37

Natürlich am Sleep 14000 im $F3:: Hotkey!
Genügend Zeit um mit der F3-Taste selbst einen #MaxThreadsPerHotkey 3 in die Sättigung zu treiben.

Besser man kommt ohne diese problematische Direktive aus!
Versuchs mal hiermit:

Code: Select all

*F2::ExitApp
#IfWinActive, ahk_exe GTA5.exe
toggle = 0
;Letzte große Änderung: Alle $ vor dem Befehl entfernt
LCtrl & F1::
Runwait, taskkill /im GTA5.exe /f
Run, "C:\Program Files\Rockstar Games\GTA V"
return
$F6::Toggle := !Toggle
$F6 Up::
While Toggle
{
	Send {w Down}
	Sleep, 50
}
Send {w up}
return
$F7::toggle := !toggle		; EIn-/Aus-Schalter
$F7 Up::
while toggle
{
	SendInput {1}{w}
	Sleep, 500
}
return
$NumpadAdd::Toggle := !Toggle
$NumpadAdd Up::
While Toggle
{
	SendInput, {Space Down}
	SendInput, {w Down}
	Sleep, 50
}
SendInput, {Space up}
SendInput, {w up}
return
$F3::toggle := !toggle		; EIn-/Aus-Schalter
$F3 Up::
while toggle
{
	SendInput {e down}
	Sleep 14000
	SendInput {e up}
	Sleep 1000
}
return
#IfWinActive
; ALLTE SCRIPTS
; ----------------------------------------------------------------------

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 03 Jan 2022, 12:43

Vielen Dank ich werde erstmal dein bearbeitetes Script nutzen und Testen, herzlichen Dank!

WKZ2209
Posts: 10
Joined: 26 Dec 2021, 19:07

Re: Taste für eine Zeit gedrückt halten, loslassen erneut drücken

Post by WKZ2209 » 21 Jan 2022, 21:15

Wollte mich zurück melden und mich vielmals bedanken! Funktioniert einwandfrei

Post Reply

Return to “Spiele”