How to Randomize Text in AHK - autohotkey

I am looking to send three different messages every 10 seconds, currently this is what I have but it is not working. As you can see, every 10 seconds I am getting a random int between 1 and 3 and then using if statements to send the corresponding number. Then from there that should send the text.
{
Sleep, 10000 ;
Random, Rand, 1, 3 ;
}
if (Rand == 1)
{
Send {1}
Send {Enter}
}
if (Rand == 2)
{
Send {2}
Send {Enter}
}
if (Rand == 3)
{
Send {3}
Send {Enter}
}
1::
send, test 1
return
2::
send, test 2
3::
send, test 3
Esc::ExitApp

First I don't see that your script is looping, so it runs once and finishes. Then I don't think the bit at the end is needed unless you are specifically wanting to be able to manually press 1, 2 or 3 and have them do something, but that was not mentioned as being your intention.
Try something like this:
stopit = 0
While stopit = 0
{
Loop, 50
{
if stopit = 1
{
ExitApp
}
Random, Rand, 1, 3
if (Rand == 1)
{
Send {1}
Send {Enter}
}
if (Rand == 2)
{
Send {2}
Send {Enter}
}
if (Rand == 3)
{
Send {3}
Send {Enter}
}
Sleep, 5000
}
}
return
F10::
stopit = 1
return
Esc::
ExitApp

To repeat an action periodically (at a specified time interval) you need a timer or a Loop as in the other answer.
AFAIK SetTimer has higher performance than a Loop and consumes less resources.
#NoEnv
#SingleInstance Force
#UseHook
SetTimer, send_random_text, 10000 ; every 10 seconds
Return
send_random_text:
Random, Rand, 1, 3
if (Rand == 1)
GoSub 1 ; jump to this hotkey label (1::)
if (Rand == 2)
GoSub 2
if (Rand == 3)
GoSub 3
Return
1::send, test 1{Enter}
2::send, test 2{Enter}
3::send, test 3{Enter}
Esc::ExitApp

Related

Delay pixel search

f1::
enterPixelSearch,x1,y1,1,100,200,100,0x000000,2,Fast RGB
if(ErrorLevel == 0)
{
sleep, 20
send
}
How do I add a sleep to the enterpixel search itself? I want to delay the function after pressing the hotkey
Something like this?:
f1::
Sleep 1000
enterPixelSearch,x1,y1,1,100,200,100,0x000000,2,Fast RGB if(ErrorLevel == 0) { sleep, 20 send }
return

Why won't my script run when attemping to make a toggle on and off key?

Im trying to make an autohotkey script that loops but only when the script is toggled on, how can i pull this off? this one just doesnt run and idk why
g::
Suspend
Pause
return
Count := 1
Loop {
if (Count = 1){
Send {s down}
Send {a down}
Send {d up}
Count := Count + 1
}else if (Count = 1000){
Send {a up}
Send {d down}
Count := Count + 1
}else if (Count = 2000){
Count := 1
}else{
Count := Count + 1
}
Sleep, 10
}
First of all, I'm not sure why you're using Suspend. Pause should be sufficient to do what you're looking for. Suspend suspends all hotkeys (except the g hotkey in this case because it's the first line in the hotkey), whereas Pause pauses the current thread. And second of all, you have your loop after the hotkey. The auto-execute section of any autohotkey script is only from the top to the first hotkey, so you need to put the loop first, then the hotkey. Here is the revised code:
Count := 1
Loop {
if (Count = 1){
Send {s down}
Send {a down}
Send {d up}
Count := Count + 1
}else if (Count = 1000){
Send {a up}
Send {d down}
Count := Count + 1
}else if (Count = 2000){
Count := 1
}else{
Count := Count + 1
}
Sleep, 10
}
g::
Pause
return

AHK Script to send different button with each successive press

Okay so I wrote this script in AHK to press 2 on the first press of the mouse button and 3 on the second and so on, yet it doesnt work. Any ideas why ?
XButton1::Send, 1;
XButton2::
x:=1
if (x = 1){
Send, 2
x+=1
} else if (x = 2) {
Send, 3
x+=1
} else if (x = 3) {
Send, 4
x+=1
} else if (x = 4) {
Send, 5
x = x - 3
}
Everytime you press XButton2, you reset the value of x to 1....x:=1. So it will obviously only send 2. You need to set the value of x outside of XButton2. This will work:
x := 1
XButton2::
x += 1
SendInput, %x%
return

How do I create while loop in autohotkey that breaks when I press {Ctrl}?

I have the following while-loop in autohotkey inside a function:
foo(){
counter:=1
while(counter<10)
{
send, %counter%
Random, SleepAmount, 2300, 3300
sleep, 3000
counter++
}
}
I want the ability to stop the loop by pressing {Ctrl}. What's the best way to accomplish my goal?
Try it this way:
F1:: foo()
foo(){
counter := 1
while(counter < 10)
{
send, %counter%
Random, SleepAmount, 23, 33
loop 100
{
Sleep, %SleepAmount%
If GetKeyState("Ctrl", "P")
return
}
counter++
}
}
~Ctrl::counter := 10
F1:: foo()
foo(){
global counter:=1
while(counter<10)
{
send, %counter%
Random, SleepAmount, 2300, 3300
sleep, SleepAmount
counter++
}
}

Is Autohotkey able to perform sequential pastes?

Is it possible to create a script for the multiple successive pastes?
Example: I copy ten different words with Ctrl+C (10 times) and paste into my doc pressing Ctrl+V (10 times).
Just for fun:
copiedText := []
~^C::
ClipWait, 0
copiedText.push(clipboard), clipboard := ""
return
^V::sendInput % copiedText.length() ? copiedText.remove(1) : _
something like this
loop,
{
position = 0
loop,
{
~^c::
if (a_index = 9){
position = 0
}
else
{
position := position + 1
}
ClipWait
var%position% := clipboard
return
}
::p1::
send, %var1%
return
::p2::
send, %var2%
return
::p3::
send, %var3%
return
::p4::
send, %var4%
return
::p5::
send, %var5%
return
::p6::
send, %var6%
return
::p7::
send, %var7%
return
::p8::
send, %var8%
return
::p9::
send, %var9%
return
::p10::
send, %var10%
return
}
save clipboard into var then input them where and how you like to.