【发布时间】:2020-04-13 20:09:17
【问题描述】:
我正在使用一个软件来操作另一个软件,例如软件测试环境,目的是获取一些值并执行一些任务。为此,我使用了 SendMessage API,它在几乎所有 Windows 控件中都运行良好,除了 CheckListBox。 “从”软件是在 Delphi 中创建的,所以我不确定 CheckListBox 是否是标准的 Windows 控件,无论如何,这是来自 MS 的文档:
https://docs.microsoft.com/en-us/windows/win32/controls/list-boxes
在这个控件中,我可以获得项目的数量、文本、选择了哪一个以及许多其他信息,但我无法知道项目是否被选中。我尝试使用“Accessibility Insights for Windows”和 AutoIt 等工具,但没有结果。
关于如何获取 Delphi CheckListBox 中复选框状态的任何想法?
提前致谢。
【问题讨论】:
-
我假设您已经尝试过
LB_GETSELITEMS? -
是的,这是关于选定的项目(突出显示的行),而不是选中的项目。
-
我正要写一个答案how to use
GetPropto access theControlOfsXXXXXXXXYYYYYYYYproperty to get a pointer to the control object in memory and then useReadProcessMemoryto find what you need when我注意到 Delphi 在访问有关已检查项目的信息时有时会使用常规的“项目数据”。看来你可以在那里使用LB_GETITEMDATA -
我认为 Delphi 在那里存储了一个
TCheckListBoxDataWrapper和一个属性State。当然,这也是一个指向目标进程内存的指针,所以无论如何你都需要ReadProcessMemory来读取实际数据。 -
Delphi 的
TCheckListBox是一个自定义控件,是标准Win32 ListBox 的包装器,使用所有者绘制的复选框,并在每个列表项的内存中存储状态信息。没有标准的 API 可以直接访问该信息,并且复选框不会暴露给 UI 自动化。即使您可以使用LB_GETITEMDATA来获取每个列表项的内部TCheckListBoxDataWrapper指针,您仍然需要使用ReadProcessMemory()来读取其State数据,是的。
标签: windows delphi winapi sendmessage