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

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

目录

Control 标识符

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

HWND

类型: 整数对象

控件的 HWND(窗口句柄的缩写) 在该控件存在期间唯一标识该控件. 直接传递 HWND, 或者以具有 Hwnd 属性的对象形式传递, 如 GuiControl 对象. 即使在 DetectHiddenWindows 关闭时, 这同样适用于隐藏控件. 后续的窗口参数将被忽略. 当传递对象时, 如果该对象没有 Hwnd 属性, 则会抛出 PropertyError, 如果它返回的不是纯整数, 则会抛出 TypeError.

可以通过 ControlGetHwnd, GuiControl.Hwnd, WinGetControlsHwnd, MouseGetPosDllCall 函数来获取控件的 HWND.

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

ClassNN

类型: 字符串

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

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

可以通过 Window Spy 来确定控件的 ClassNN, 也可通过 ControlGetClassNN, WinGetControlsMouseGetPos 来获取.

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

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

Text

类型: 字符串

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

可以通过 Window Spy 来确定控件的文本内容, 也可以通过 ControlGetText, GuiControl.TextGuiControl.Value 来获取文本内容.

留空

ControlClick, ControlSend, PostMessageSendMessage 函数均可作用于控件或顶层窗口. 若省略 ControlID 参数, 则该函数将使用指定的窗口(由 WinTitle 参数指定), 而非其任一控件.

备注

以下函数具有 ControlID 参数: ControlAddItem, ControlChooseIndex, ControlChooseString, ControlClick, ControlDeleteItem, ControlFindItem, ControlFocus, ControlGetChecked, ControlGetChoice, ControlGetClassNN, ControlGetEnabled, ControlGetHwnd, ControlGetIndex, ControlGetItems, ControlGetPos, ControlGetStyle, ControlGetText, ControlGetVisible, ControlHide, ControlHideDropDown, ControlMove, ControlSend, ControlSetChecked, ControlSetEnabled, ControlSetStyle, ControlSetText, ControlShow, ControlShowDropDown, EditGetCurrentCol, EditGetCurrentLine, EditGetLine, EditGetLineCount, EditGetSelectedText, EditPaste, ListViewGetContent, PostMessage, SendMessage. 这些函数中的大多数在其对应的页面上都有示例, 这些示例展示了控件标识符的使用方法.

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

WinTitle 参数 & 上次找到的窗口