- 版本 v1.1.15.01
- 指南和概述
- 常见问题(FAQ)
- 按字母排序的命令和函数索引
- AutoHotkey 脚本展示
- 变更和新功能
- 基本用法和语法
- 迁移到 AutoHotkey 1.1(AutoHotkey_L)
- 环境管理
- 本机代码互操作
- 文件、目录和磁盘管理
- Drive
- DriveGet
- DriveSpaceFree
- FileAppend
- FileCopy
- FileCopyDir
- FileCreateDir
- FileCreateShortcut
- FileDelete
- FileEncoding [AHK_L 42+]
- FileGetAttrib
- FileGetShortcut
- FileGetSize
- FileGetTime
- FileGetVersion
- FileInstall
- FileMove
- FileMoveDir
- FileOpen [AHK_L 42+]
- FileReadLine
- FileRead
- FileRecycle
- FileRecycleEmpty
- FileRemoveDir
- FileSelectFile
- FileSelectFolder
- FileSetAttrib
- FileSetTime
- IfExist / IfNotExist
- IniDelete
- IniRead
- IniWrite
- Loop(文件和文件夹)
- Loop(读取文件内容)
- SetWorkingDir
- SplitPath
- 流程控制
- 内置函数
- GUI、MsgBox、InputBox 及其他对话框
- 鼠标和键盘
- 鼠标和键盘
- #InstallKeybdHook
- #InstallMouseHook
- #KeyHistory
- BlockInput
- Click [v1.0.43+]
- ControlClick
- ControlSend / ControlSendRaw
- CoordMode
- GetKeyState
- KeyHistory
- KeyWait
- Input
- MouseClick
- MouseClickDrag
- MouseGetPos
- MouseMove
- Send / SendRaw / SendInput / SendPlay / SendEvent: 发送按键和点击
- SendLevel [v1.1.06+]
- SendMode [v1.0.43+]
- SetDefaultMouseSpeed
- SetKeyDelay
- SetMouseDelay
- SetCapsLockState/SetNumLockState/SetScrollLockState
- SetStoreCapslockMode
- 数学相关
- 屏幕管理
- 杂项命令
- 进程管理
- 注册表管理
- 声音命令
- 字符串管理
- 窗口管理
- 控件
- 窗口组
- #WinActivateForce
- DetectHiddenText
- DetectHiddenWindows
- SetTitleMatchMode
- SetWinDelay
- StatusBarGetText
- StatusBarWait
- WinActivate
- WinActivateBottom
- WinClose
- WinGet
- WinGetActiveStats
- WinGetActiveTitle
- WinGetClass
- WinGetPos
- WinGetText
- WinGetTitle
- WinHide
- WinKill
- WinMaximize
- WinMinimize
- WinMinimizeAll / WinMinimizeAllUndo
- WinMove
- WinRestore
- WinSet
- WinSetTitle
- WinShow
- WinWait
- WinWaitActive / WinWaitNotActive
- WinWaitClose
- #指令
For 循环 [AHK_L 59+]
对对象中的每对键值对重复执行一系列命令。
For Key [, Value] in Expression
参数
- 键
在每次重复开始时用来保存键的变量名称.
- 值
保存与当前键关联的值的变量名.
- Expression
结果为对象的 表达式 或包含对象的变量.
备注
只在循环开始前计算一次 表达式. 如果其结果不是对象, 则立即跳转到循环体后面的语句执行; 否则, 调用对象的 _NewEnum()
来获取 枚举数 对象. 每次重复开始时, 使用枚举数的 Next() 方法获取下一个键值对. 如果 Next() 返回零或空字符串, 则循环终止.
尽管不完全等同于 for 循环, 不过下面演示了近似于它的循环过程:
_enum := (Expression)._NewEnum() if IsObject(_enum) while _enum.Next(Key, Value) { ... }
现有的键值对可以在循环中修改, 但插入或移除键可能导致一些项目被跳过或枚举多次. 一种解决方法是建立待移除的键列表, 在首个循环结束后使用第二个循环来移除这些键. 请注意使用 Object.Remove(first, last)
可以直接移除键的范围而不需要循环.
for 循环后通常跟着 区块, 这是构成循环 体 的语句的集合. 不过, 在单语句的循环中可以不使用区块 (用于此目的时 "if" 与其相匹配的 "else" 一起被视为单语句). 可以使用 One True Brace (OTB) 风格, 这样允许左大括号与 while 在同一行而不是在其下面. 例如:for x, y in z {
。
和所有的循环一样, 循环中可以使用 Break, Continue 和 A_Index.
COM 对象
因为 Key 和 Value 被直接传递给枚举数的 Next() 方法, 所以它们的值取决于被枚举的对象类型. 对于 COM 对象, Key 包含由 IEnumVARIANT::Next() 返回的值, 而 Value 包含了表示其 变量类型 的数字. 例如, 用于 Scripting.Dictionary 对象时, 每个 Key 包含字典中的键而 Value 通常为 8 (对于字符串) 和 3 (对于整数). 请参阅 ComObjType 了解类型代码表.
[v1.0.96.00+]: 枚举 SafeArray 时, Key 包含了当前元素而 Value 包含其变量类型.
相关
枚举数对象, Object.NewEnum(), While 循环, Loop, Until, Break, Continue, 区块
示例
; 列出对象中的键值对: colours := Object("red", 0xFF0000, "blue", 0x0000FF, "green", 0x00FF00) ; 上面的表达式可以直接代替下面的“colours”: for k, v in colours s .= k "=" v "`n" MsgBox % s
; 列出所有的资源管理器和 Internet Explorer 窗口: for window in ComObjCreate("Shell.Application").Windows windows .= window.LocationName " :: " window.LocationURL "`n" MsgBox % windows
/* Class: CEnumerator 能用来循环数值键的通用枚举器对象。在循环中不能修改数组,否则循环的区间可能出错。可以定义自己的 MaxIndex() 函数来表示数组边界。如果在 1 和最大索引间有缺失的数组成员,仍会循环到它们但值为空。这是说这个枚举器被设计为不支持真正的数组解析。要在对象能使用这种循环,请在它的类定义中插入这个函数: _NewEnum() { return new CEnumerator(this) } 来源:http://www.autohotkey.com/board/topic/2667-suggestions-on-documentation-improvements/?p=531509 */ ; 对枚举器进行循环 For k, v in Test MsgBox %k%=%v% ; 用于演示的测试类 class Test { static Data := ["abc", "def", "ghi"] _NewEnum() { return new CEnumerator(this.Data) } } class CEnumerator { __New(Object) { this.Object := Object this.first := true ; 加速的缓存。当 MaxIndex() 函数性能差时用得上。 ; 副作用是在循环时不能插入键值对,否则区间是错误的。 this.ObjMaxIndex := Object.MaxIndex() } Next(ByRef key, ByRef value) { if (this.first) { this.Remove("first") key := 1 } else key ++ if (key <= this.ObjMaxIndex) value := this.Object[key] else key := "" return key != "" } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论