I would like to get the tooltip text for win32 legacy control (not WPF controls that inherently support UI Automation).
What I have done:
- Given a button of interest, I've got its
AutomationElement
, and its bounding rect - I moved the mouse over this button (in code);
Thread.Sleep(1500)
to wait for the tooltip control to popup;- Enumerate Desktop's all child windows, and get the child window
tooltipAutomationElement
, whose type is"Tooltip"
; - From
tooltipAutomationElement
, get this tooltip's name property, which corresponds to the tooltip string.
This actually works, but the penalty is: I have to sleep(1500)
and manually wait for the tooltip to appear (5-20 buttons are to be scanned for the tooltip strings), which does not match performance requirement.
What is expected (not sure if it is feasible)
- Programmatically get the button's tooltip string without requiring the tooltip to appear
- Without having to place mouse over each button one-by-one.
Update 1: For TTN_NEEDTEXT
, MSDN doc seems not very clear, and I have no clue how to program this using C#. One of the relevant link for low level structures/messages related to tooltip control can be found here.
Update 2: Those who believe this could be done by ... , I would say, it is easier said than done. I welcome those who have tried, to comment on this, and some ostensibly feasible solutions are welcome if you can offer some evidence to show its applicability and efficacy.
Update 3: If we try to minimize the TTM_SETDELAYTIME
so that N
in the sleep(N)
can be minimized, this does not work after some experimentation. We can only adjust this once the tooltip window handle exists. e.g.
SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms
Update 4: using TTM_GETTEXTA
message seems to be a solution, however, it is similar to Update 3, where we need the handle of the tooltipCtrl
, which is only available AFTER the tooltip is created, since to have this tooltip created, we have no choice but to hover mouse cursor above the tool, which seems to have performance issues (Thread.Sleep
) as outlined above.
SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti);
Update 5: "How to get the tooltip text" using InterOp (PInvoke) or Automation UI using traditional approach (mouse hovering on the tool window, find the Hwnd handle, then get its text...) is not the concern of this post. What is expected: Can we extract the tooltip string of a control (say a button) with no need of hovering upon the control? If yes, how?
Update 6: using WM_MOUSEHOVER to activate the tooltip window seems not working, I have tested that out using SendMessage(...) with proper wparam and lparam filled, but in vein.