ControlID 参数(窗口控件标识符)

一些命令具有 ControlID 参数, 用于确定要操作的窗口中的哪个控件. 此参数可以是控件的文本内容, 也可以是本页面中描述的任何其他标识符.

目录

Control 标识符

以下标识符是按照降序优先级排列的. 在极少数出现歧义的情况下, 此细节非常重要. 例如, 如果一个窗口有两个编辑控件, 第一个的文本为 "Edit2" 第二个的类名 ClassNN 为 "Edit2", 而使用了 Control, Hide,, Edit2, 那么第二个控件将会被隐藏, 因为 ClassNN 具有更高的优先级.

HWND

控件的 HWND(窗口句柄的缩写) 在该控件存在期间唯一标识该控件. 要对其进行操作, 请将 ControlID 参数留空, 并指定 ahk_id %ControlHwnd%WinTitle 参数(即使在 DetectHiddenWindows 关闭时, 此方法也能适用于隐藏控件.). [v1.1.04+]: GuiControlGuiControlGet 允许直接在 ControlID 中指定 HWND.

可以通过 DllCall(), [v1.0.43.06+] 中通过 ControlGet Hwnd, WinGet ControlListHwndMouseGetPos, [v1.0.46.01+] 中通过 Gui Add 的 Hwnd 选项, 和 [v1.0.46.16+] 中通过 GuiControlGet Hwnd 来获取控件的 HWND.

当通过 PostMessage, SendMessage, 或者使用 DllCall 调用原生 API 来直接向控件发送消息时, 使用 HWND 尤为有用. 此外, 当控件是动态创建或重新排列时, 使用 HWND 也很有帮助, 因为 HWND 在控件的整个生命周期内保持不变.

关联变量

一个图形用户界面控件可以通过与其相关联的变量的名称来识别. 这适用于使用 Gui Add 带有 V 选项创建的控件(例如 vMyEdit). 该变量名称将作为控件的标识符, 用于 GuiControlGuiControlGet.

使用关联变量通常是最便捷的方式来标识图形用户界面控件, 即便这些控件不具备输入功能(如 TextGroupBox). 在这些情况下, 该变量并不存储输入内容, 但仍能提供一个稳定且易于阅读的标识符.

ClassNN

控件的 ClassNN 是由其窗口类的名称后跟在包含它的顶层窗口中的序号. 该序号反映了该控件在同类控件中的位置, 即按照其创建的先后顺序排列. 例如, Edit1 是一个窗口中的第一个编辑控件, 而 Button12 则是第十二个按钮.

有些类名包含不属于控件序号的数字. 例如, SysListView321 示的是该窗口中的第一个 ListView 控件, 而非第 321 个. 若要获取不含序号的类名, 则需将控件的 HWND 传递给 WinGetClass.

可以通过 Window Spy 来确定控件的 ClassNN. 一些命令, 如 ControlGetFocus, GuiControlGet Focus, WinGet ControlListMouseGetPos 也可获取 ClassNN.

序号并非持久标识符. 如果应用程序重新创建控件, 改变其排列顺序, 或者使用动态或虚拟化用户界面元素, 该序号可能会发生变化. 一些现代框架(如 WPF 或 Electron) 可能根本不提供传统的 Win32 类名, 或者可能会为多个不相关的控件重复使用通用类名.

在控件没有固定文本且控件顺序稳定的情况下, 使用 ClassNN 通常会比较方便. 但若无法保证稳定性时, 则应考虑使用 HWND 或其他标识符.

Text

控件的文本可以作为标识符使用, 例如 OK 用于 OK(确认) 按钮. 匹配行为由 SetTitleMatchMode 决定. 当文本唯一和稳定时, 可以使用文本; 许多控件会动态更新其内容或者根本不展示有意义的文本.

可以通过 Window Spy 来确定控件的文本内容. 一些命令, 如 ControlGetTextGuiControlGet 也可用来获取这样的文本.

留空

对于非图形用户界面命令, 若省略 ControlID 参数, 则这些命令将作用于目标窗口的最顶层控件. 然而, 其中有一些命令在省略此参数时会有特殊的行为:

对于 GuiControlGet, 如果省略了 ControlID 参数, 那么它就会像指定了与该控件相关联的变量名(如果有) 那样进行操作.

备注

以下命令具有 ControlID 参数: Control, ControlClick, ControlFocus, ControlGet, ControlGetPos, ControlGetText, ControlMove, ControlSend, ControlSetText, GuiControl, GuiControlGet, PostMessage, SendMessage. 这些命令中的大多数在其对应的页面上都有示例, 这些示例展示了控件标识符的使用方法.

当应用程序重新创建控件, 改变其顺序, 使用动态或虚拟化界面, 或者依赖那些未公开稳定 Win32 类名或文本的框架时, ClassNN 和控件文本可能会发生变化. 当标识符不可靠时, 应优先使用 HWND 进行生命周期稳定的寻址, 或者结合多个条件. 一般建议如下: 当控件文本是唯一且稳定的时, 使用控件文本; 当控件顺序一致且需要可读性时, 使用 ClassNN; 当需要最大稳定性时, 使用 HWND. 除非您控制目标应用程序, 否则在不同应用程序版本之间避免硬编码标识符.

WinTitle 参数 & 上次找到的窗口