matiszac
matiszac

Reputation: 125

AutoHotKey Global Variable that can be accessed and modified by different macros?

I've seen a similar topic on sof but its solution did not help me. This is ticking my mind and basically all i want is to have some method of accessing and modifying a value that will maintain its last changed state through out my macros in my single .ahk file.

See example below ,

~Home::Suspend

XButton1::

tog()

return

LButton::

shot()

return



var := "1"

tog(){
var *= -1
}

shot(){

If (var = "1") {

    Loop, 1 {

        Send {k}
        Sleep 65
        Send {WheelDown}
        Sleep 100
        Send {WheelUP}
        Sleep 10

    }

} Else {

    Send {k}

}

}

I am aware that the above is incorrect, and i tried to use"global" in my functions but i just couldn't get my desired effect.

Upvotes: 5

Views: 7296

Answers (3)

willprot
willprot

Reputation: 41

I had the same issue and after some trial and error I found my mistake which is the same as in the provided code:

The correct way to declare a global is before other functions

var := "1"

XButton1::
     ; code...
return

The code in the OPs script will hit the return first and never declare the variable

XButton1::
   ; code...
return     ; Returns Here

var := "1" ; Incorrect Will Not Be Declared

I just wanted to provide this as an answer because while I did see this information in one of the comments, I didn't see it until after I'd already spent an additional hour figuring it out myself. As this is the answer I needed, having it as an actual prominent answer may help someone else save time.

Upvotes: 4

Robert Ilbrink
Robert Ilbrink

Reputation: 7953

What I did, especially since I sometimes have multiple scripts running that need to access the same variable, is to place the var in a .ini file. I also use this to preserve the variable value after a restart. The solution is somewhat slower since the data is saved to the hard disk / SSD, but it works beautifully.

Example of writing the value "S" to variable "State" in group "Finish"

IniWrite, S, C:\2Podcasts\FinishOptions.ini, Finish, State

In an other script (other AutoHotKey instance), I read the value and assign it to the variable "FinishOption".

IniRead, FinishOption, C:\2Podcasts\FinishOptions.ini, Finish, State

If you want to toggle values (True/False), you could use this. This will do an IF on the current value of the variable AND set the variable to the opposite value.

If (MyLoop := !MyLoop) ; Toggle the variable "MyLoop" True/False
{
    Do something
}
Else
{
    Do something else
}
return

Upvotes: 3

Ani
Ani

Reputation: 576

Using the "global" should work. Something like:

shot(){
    global var
    If (var = "1") {

That points the 'var' variable in the shot() function to the existing 'var' variable defined outside the function.

Upvotes: 4

Related Questions