Dav*_*vid 21 c# winapi automation tooltip
我想获得win32遗留控件的工具提示文本(不是WPF控件本身支持UI自动化).

我做了什么:
AutomationElement和它的边界矩形Thread.Sleep(1500) 等待弹出工具提示控件;tooltipAutomationElement其类型为的子窗口"Tooltip";tooltipAutomationElement,获取此工具提示的名称属性,该属性对应于工具提示字符串.这实际上是有效的,但是惩罚是:我必须sleep(1500)手动等待工具提示出现(要扫描工具提示字符串的5-20个按钮),这与性能要求不符.
预期结果(不确定是否可行)
更新1:对于TTN_NEEDTEXT,MSDN doc似乎不是很清楚,我不知道如何使用C#编程.可以在此处找到与工具提示控制相关的低级结构/消息的相关链接之一.
更新2:那些相信这可以通过......完成的人,我会说,说起来容易做起来难.我欢迎那些尝试过对此发表评论的人,如果你能提供一些证据来证明它的适用性和功效,我欢迎一些表面上可行的解决方案.
更新3:如果我们试图尽量减少TTM_SETDELAYTIME,以便N在sleep(N)可以最小化,这不经过一些实验工作.我们只能在工具提示窗口句柄存在后进行调整.例如
SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms
Run Code Online (Sandbox Code Playgroud)
更新4:使用TTM_GETTEXTA消息似乎是一个解决方案,但是,它类似于Update 3,我们需要它的句柄,tooltipCtrl只有在创建工具提示后才可用,因为要创建此工具提示,我们别无选择,将鼠标光标悬停在工具上方,这似乎有如上所述的性能问题(Thread.Sleep).
SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti);
Run Code Online (Sandbox Code Playgroud)
更新5:"如何获取工具提示文本"使用InterOp(PInvoke)或Automation UI使用传统方法(鼠标悬停在工具窗口上,找到Hwnd句柄,然后获取其文本...)不是这篇文章的关注点.预期结果:我们可以提取控件的工具提示字符串(比如一个按钮)而不需要悬停在控件上吗?如果有,怎么样?
更新6:使用WM_MOUSEHOVER激活工具提示窗口似乎不起作用,我已经使用SendMessage(...)测试了正确的wparam和lparam填充,但静脉.
从 UI 自动化的角度来看,我们能做的最好的事情就是订阅 ToolTip Opened 事件,并在事件处理程序中进行相同的处理。此链接有一个示例http://msdn.microsoft.com/en-us/library/ms752286.aspx。UI 自动化事件列表可以在此处找到:http://msdn.microsoft.com/en-us/library/ms748252.aspx。有关 AutomationElement.ToolTipOpenedEvent 的详细信息,请访问http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.tooltipopenedevent.aspx。
至少使用 UI 自动化,我们应该让事情发生,无论是单击按钮、打开窗口还是显示工具提示。因此,订阅 ToolTip 事件可以完成这里的工作,并且比硬性 Sleep() 延迟具有更好的性能。否则,少数人提到的 hacky 方法(尽管不是端到端)是预先获取工具提示字符串的资源字符串 id,并在执行自动化测试期间验证资源字符串。