Input

等待用户输入字符串。

Input [, OutputVar, Options, EndKeys, MatchList]

参数

OutputVar

用来保存用户输入文本的变量名 (默认情况下, 模拟输入也被保存下来).

如果省略此参数和其他参数, 那么会终止在其他 线程 中正在执行的任何 Input 并且将那个 Input 的 ErrorLevel 设置为单词 NewInput. 与之相比, 如果终止了之前的 Input 则把当前线程的 ErrorLevel 设置为 0, 如果没有需要终止的 Input 则为 1.

OutputVar 本身并不记录键击. 而是记录通过键击根据活动窗口的键盘布局/语言产生的字符. 因此, 不产生字符的键击 (例如 PageUp 和 Escape) 不会被记录下来 (尽管可以通过下面的 EndKeys 参数识别它们).

会原义保存空白字符, 例如 TAB (`t). ENTER 被保存为换行符 (`n).

选项

由零个或多个下列字母组成的字符串 (可任意顺序, 字母间可以用空格分隔):

B: 忽略退格键. 一般情况下, 按下退格键会删除最后一个输入的字符. 注: 如果输入的文本是可见的 (例如在编辑器中), 在其中使用方向键或其他方式移动了光标后, 退格键仍然会删除最后一个字符而不是光标 (插入点) 后面的字符.

C: 区分大小写. 一般情况下, MatchList 是不区分大小写的 (在 1.0.43.03 之前的版本中, 只有字母 A-Z 被认为具有大小写形式, 而像 ü/Ü 这样的字母则没有).

I: 忽略由 AutoHotkey 脚本产生的所有字符, 例如 SendEvent 命令. 然而, 不论此设置如何, SendInputSendPlay 模式生成的输入总是被忽略.

L:长度限制(例如 L5)。允许输入文本的最大长度. 当文本到达这个长度,则输入会被终止且 ErrorLevel 被设置为单词 Max,不过如果此时文本匹配 MatchList 中的某个词组,则把 ErrorLevel 设置为单词 Match。如果未指定, 则长度限制为 16383, 这也是绝对的最大长度.

M: 如果含修饰符的键击 (例如 Control-A 到 Control-Z) 对应于真实的 ASCII 字符, 则会识别并对它们进行转译. 参考这个例子, 其中识别了 Control-C:

Transform, CtrlC, Chr, 3 ; 把 Ctrl-C 对应的字符保存到 CtrlC 变量。
Input, OutputVar, L1 M
if OutputVar = %CtrlC%
    MsgBox, You pressed Control-C.
ExitApp

注: 从 Ctrl-A 到 Ctrl-Z 对应的字符为从 Chr(1)Chr(26). 此外,M 选项可能会导致某些键盘快捷键(例如 Ctrl-LeftArrow)在 Input 执行时表现不正常。

T:超时(例如 T3)。在终止输入前等待的秒数,超时后设置 ErrorLevel 为单词 Timeout。Input 超时后,OutputVar 会被设置为用户在超时前输入的文本。这个值可以为浮点数, 例如 2.5.

V: 可见. 一般情况下, 用户的输入是阻塞的 (隐藏在操作系统后). 使用此选项来发送用户的键击到活动窗口.

*: 通配符 (查找所有地方). 一般情况下, 用户输入的文本必须准确匹配 MatchList 中的某个词组, 匹配才会成功. 使用此选项搜索输入文本的整个长度, 这样会更容易找到匹配.

EndKeys

零个或多个按键组成的列表, 按下其中的任何一个都可以终止输入 (EndKey 自身不会被写入 OutputVar). 使用此方式终止输入后, ErrorLevel 被设置为单词 EndKey 后跟着冒号和 EndKey 的名称. 例如:EndKey:., EndKey:Escape

EndKey 列表使用类似于 Send 命令的格式. 例如,指定 {Enter}.{Esc} 会使得 ENTER、句点(.)或 ESCAPE 其中任何一个都可以终止输入。要使用大括号作为终止键,请指定 {{} 和/或 {}}

要使用 Control, Alt 或 Shift 作为终止键, 请指定它们的左和/或右版本, 而不是中性版本. 例如,指定 {LControl}{RControl} 而不是 {Control}

尽管不支持诸如 Control-C (^c) 这样修饰键, 但在 v1.0.14+ 中支持某些需要按住 shift 键来输入的字符 (即标点符号, 例如 ?!:@&{}).

还可以指定明确的虚拟按键代码,例如 {vkFF}。只有在一个按键没有指定名称且按下时不产生可见的字符这样少见的情况下, 这种方法才有用. 它的虚拟按键代码可以通过按键列表页面底部的步骤来确定。

MatchList

逗号分隔的关键词组列表, 其中的任何一个都可以终止输入 (此时 ErrorLevel 被设置为单词 Match). 用户输入的全部文本必须准确匹配列表中的某个词组, 匹配才会成功 (除非使用了 * 选项). 此外, 在分隔逗号周围的任何空格或 tab 都是有意义的, 这表示它们也是匹配字符串的一部分. 例如, 如果 MatchList 为 "ABC , XYZ ", 则用户必须输入在 ABC 后或 XYZ 前输入空格才形成匹配.

在匹配列表中两个连续的逗号产生单个原义逗号. 例如, 后面的匹配列表会在 string1 的末尾产生单个原义逗号: "string1,,,string2". 同样地, 后面的匹配列表仅包含其中含有一个原义逗号的单个项目: "single,,item".

因为 MatchList 中的每一项并不是作为独立的参数, 所以此列表可以完整的包含在一个变量中. 事实上, 如果此列表的长度超过 16383, 那么列表的全部或部分必须包含在变量中以变量表示, 因为这个长度是任何脚本行的最大长度. 例如,MatchList 可以由 %List1%,%List2%,%List3% 组成,其中的每个变量包含了用来匹配词组的一个大的子列表。

ErrorLevel

[v1.1.04+] 此命令在不带参数调用且没有 Input 正在执行时会抛出异常. 想了解更多信息, 请参阅 运行时错误.

1 或 0

不带参数使用此命令时, 如果成功终止了之前的 Input 则 ErrorLevel 被设置为 0, 如果没有需要终止的 Input 则为 1.

NewInput 此 Input 被另一个使用 Input 的 线程 中断.
Max 输入的文本达到了允许的最大长度且没有匹配 MatchList 中的任何一项.
超时 输入超时.
Match 输入的内容匹配 MatchList 中的某项.
EndKey:name EndKeys 的某个终止键被按下来终止了输入. 此时,ErrorLevel 包含单词 EndKey 后跟着冒号和不带大括号的终止键的名称,例如 “EndKey:Enter”,“EndKey:Escape”等等。

备注

如果在使用此命令时另一个 线程 中的 Input 正在执行, 则那个 Input 会被终止且其 ErrorLevel 会被设置为单词 NewInput. 之后 (如果给出了参数), 新的 Input 开始执行.

在执行 Input 时, 仍然可以启动新的 线程 (例如 自定义菜单项计时子程序). 同样地, 当 Input 可见 时键盘 热键 仍然是有效的. 如果 Input 不可见, 那么只会触发 钩子热键.

脚本中首次使用此命令时, 会安装 键盘钩子 (在还没有安装时). 同时, 脚本变成 持续运行的, 这意味着应该使用 ExitApp 结束脚本. 键盘钩子会一直保持加载状态, 直到下一次使用 SuspendHotkey 命令, 此时如果没有任何热键或热字串需要那么它会被移除.

如果您使用多种语言或多种键盘布局, 则 Input 会使用活动窗口的键盘布局而不是脚本的 (不论 Input 是否 可见). 然而, 在 1.0.44.03 之前的脚本中, 则使用脚本自己的布局.

尽管不够灵活, 但 热字串 通常比 Input 命令更容易使用.

相关

KeyWait, 热字串, InputBox, #InstallKeybdHook, 线程, if var in/contains MatchList

示例

; 等待用户按下任意键.  产生不可见字符的这些键 (例如
; 修饰键, 功能键和方向键) 已经被列为终止键, 这样
; 就能检测到它们.
Input, SingleKey, L1, {LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}

 

; 这是个可运行的热键示例.  由于此热键含有颚化符(~)
; 前缀,所以它本身的键击会被传递到活动窗口。; 因此,如果您键入 [btw(或其他某个匹配
; 词组)到任意编辑器中,脚本会自动执行
; 您选择的动作(例如替换键入的文本):

~[::
Input, UserInput, V T5 L4 C, {enter}.{esc}{tab}, btw,otoh,fl,ahk,ca
if (ErrorLevel = "Max")
{
    MsgBox, You entered "%UserInput%", which is the maximum length of text.
    return
}
if (ErrorLevel = "Timeout")
{
    MsgBox, You entered "%UserInput%" at which time the input timed out.
    return
}
if (ErrorLevel = "NewInput")
    return
If InStr(ErrorLevel, "EndKey:")
{
    MsgBox, You entered "%UserInput%" and terminated the input with %ErrorLevel%.
    return
}
; 否则,找到了匹配。
if (UserInput = "btw")
    Send, {backspace 4}by the way
else if (UserInput = "otoh")
    Send, {backspace 5}on the other hand
else if (UserInput = "fl")
    Send, {backspace 3}Florida
else if (UserInput = "ca")
    Send, {backspace 3}California
else if (UserInput = "ahk")
    Run, http://ahkscript.org
return