我想获取 win32 旧版控件的工具提示文本(不是固有地支持UI 自动化的 WPF 控件)。
我做了什么:
- 给定一个感兴趣的按钮,我有它的
AutomationElement
, 和它的边界矩形 - 我将鼠标移到这个按钮上(在代码中);
Thread.Sleep(1500)
等待工具提示控件弹出;- 枚举Desktop的所有子窗口,得到子窗口
tooltipAutomationElement
,其类型为"Tooltip"
; - 从
tooltipAutomationElement
中,获取此工具提示的名称属性,该属性对应于工具提示字符串。
这实际上可行,但代价是:我必须sleep(1500)
手动等待工具提示出现(要扫描 5-20 个按钮以查找工具提示字符串),这不符合性能要求。
预期什么(不确定是否可行)
- 以编程方式获取按钮的工具提示字符串,而无需显示工具提示
- 无需将鼠标一个一个地放在每个按钮上。
更新 1:对于TTN_NEEDTEXT
,MSDN 文档似乎不是很清楚,我不知道如何使用 C# 进行编程。可以在此处找到与工具提示控件相关的低级结构/消息的相关链接之一。
更新 2:那些相信这可以通过 ... 来完成的人,我想说,说起来容易做起来难。我欢迎那些尝试过的人对此发表评论,如果您能提供一些证据来证明其适用性和有效性,也欢迎一些表面上可行的解决方案。
更新 3:如果我们尝试最小化以便TTM_SETDELAYTIME
可以最小化,经过一些实验后这不起作用。我们只能在工具提示窗口句柄存在时进行调整。例如N
sleep(N)
SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms
更新 4:使用TTM_GETTEXTA
消息似乎是一个解决方案,但是,它类似于更新 3,我们需要的句柄,tooltipCtrl
只有在创建工具提示后才可用,因为要创建此工具提示,我们别无选择将鼠标光标悬停在工具上方,这似乎存在如上所述的性能问题 ( Thread.Sleep
)。
SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti);
更新 5:“如何获取工具提示文本”使用 InterOp (PInvoke) 或使用传统方法的自动化 UI(鼠标悬停在工具窗口上,找到 Hwnd 句柄,然后获取其文本......)不是这篇文章的关注点. 预期内容:我们可以在不需要悬停在控件上的情况下提取控件(比如按钮)的工具提示字符串吗?如果是,如何?
更新 6:使用 WM_MOUSEHOVER 激活工具提示窗口似乎不起作用,我已经使用 SendMessage(...) 进行了测试,并填充了正确的 wparam 和 lparam,但在静脉中。