【问题标题】:Autohotkey: how to declare global variable after #ifwinactiveAutohotkey:如何在#ifwinactive 之后声明全局变量
【发布时间】:2020-09-19 20:35:11
【问题描述】:

当我在#ifwinactive 之后声明一个全局变量时,会弹出一条错误消息,显示该变量未声明。

我有一个很长的脚本,其中有很多#ifwinactive ahk_exe xxx。在这些代码下面,我想声明一个全局变量。但这不起作用。每当我运行脚本时,它都会警告我未声明全局变量。这是我的脚本简介。

在脚本的顶部,我有这些环境设置:

#NoEnv  
#Warn  
SendMode Input 
SetWorkingDir %A_ScriptDir%
SetTitleMatchMode, 2

然后我有许多特定于窗口的热键:

#ifwinactive ahk_exe Explorer.EXE
;some hotkeys
#ifwinactive ahk_exe WINWORD.EXE
;some extra hotkeys
;etc.

在底部,我尝试声明一个全局变量,这就是发生错误的地方:

#ifwinactive
a := 1
^p::
    if (a != 1){
        a := 1
    } else {
        a := 0
    }
return 

#if winactive("- YouTube -") and a != 1
    p::msgbox,Yes
#if a = 1 and winactive("- YouTube -")
    p::msgbox,no
#if

【问题讨论】:

    标签: if-statement variables global-variables autohotkey declare


    【解决方案1】:

    您在 auto-execute section 之外声明变量 a
    代码执行实际上永远不会到达a := 1,当您遇到第一个热键定义时它就会停止。
    另外,这不是错误,只是警告。由于 AHK 的宽容度,如果您在使用前不声明变量实际上并不重要。它会从默认值 nothing 开始,这适用于您的 a != 1 检查。
    此外,在您至少运行一次 ^p 热键后,它会按预期运行。

    但无论如何,为了摆脱警告,您应该在脚本的自动执行部分(在顶部)声明变量。

    还有一点需要考虑:
    不要使用#If,除非你真的需要它。它可能会导致麻烦(如文档所述),具体取决于您拥有的脚本类型。
    如果你只需要检查一次胜利主动检查,并且只需要检查一次切换,我认为它真的不需要使用#If

    【讨论】:

    • 你能解释一下你的最后一点吗?是的,我想做的是创建一个热键来切换应用程序中其他热键的功能。
    • #if 适用于您在热键触发之前确实需要检查的情况,但听起来您不需要。相反,您可以执行this 之类的操作。
    • 似乎if() 更适合单个热键,而#if 更适合像this 这样的多个热键。
    • 是的,这绝对是非常方便的,在这样一个简单的脚本中,它很可能会很好。请记住,如果您遇到#if 可能带来的麻烦,您可以放弃它。
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2018-12-16
    相关资源
    最近更新 更多