如何获取给定HWND的工具提示文本?

我正在寻找一种方法来获得与给定HWND相关的工具提示控制(如果有的话)。 工具提示控件的文本也足够了。 我发现的最接近的是TTM_GETTEXT消息,但它意味着要发送到工具提示控件本身而不是它与之关联的工具。 我虽然没有工具提示控件的句柄。 有人知道怎么做这个吗?

所有这些都是使用C ++中的普通Windows API完成的。

似乎没有从控件获取提示或其文本的特定消息,但这是MFC的CWnd类实现OnToolHitTest()的方式,您应该能够适应Win32:

INT_PTR SomeFunction(HWND hWndChild, TOOLINFO *pTI) { if (hWndChild != NULL) // Your HWND being tested { // return positive hit if control ID isn't -1 INT_PTR nHit = _AfxGetDlgCtrlID(hWndChild); // Replace with GetDlgCtrlID(). // hits against child windows always center the tip if (pTI != NULL && pTI->cbSize >= sizeof(AFX_OLDTOOLINFO)) { // setup the TOOLINFO structure pTI->hwnd = m_hWnd; pTI->uId = (UINT_PTR)hWndChild; pTI->uFlags |= TTF_IDISHWND; pTI->lpszText = LPSTR_TEXTCALLBACK; // set TTF_NOTBUTTON and TTF_CENTERTIP if it isn't a button if (!(::SendMessage(hWndChild, WM_GETDLGCODE, 0, 0) & DLGC_BUTTON)) pTI->uFlags |= TTF_NOTBUTTON|TTF_CENTERTIP; } return nHit; } return -1; // not found } 

希望这将是有用的。

要从某个控件获取工具提示文本,您可以使用TTN_NEEDTEXT消息。 它被设计为由ToolTip控件使用,但我看不出为什么你不能从其他地方发送它的任何理由。

您可以枚举窗口以查找具有所需窗口的父级的工具提示控件。 您需要提供窗口以及工具ID(通常来自GetDlgCtrlID )…:

 HWND hToolTipWnd = NULL; BOOL GetToolTipText(HWND hWnd, UINT nId, std::wstring& strTooltip) { hToolTipWnd = NULL; EnumWindows(FindToolTip, (LPARAM)hWnd); if (hToolTipWnd == NULL) return FALSE; WCHAR szToolText[256]; TOOLINFO ti; ti.cbSize = sizeof(ti); ti.hwnd = hWnd; ti.uId = nId; ti.lpszText = szToolText; SendMessage(hToolTipWnd, TTM_GETTEXT, 256, (LPARAM)&ti); strTooltip = szToolText; return TRUE; } BOOL CALLBACK FindToolTip(HWND hWnd, LPARAM lParam) { WCHAR szClassName[256]; if (GetClassName(hWnd, szClassName, 256) == 0) return TRUE; if (wcscmp(szClassName, L"tooltips_class32") != 0) return TRUE; if (GetParent(hWnd) != (HWND)lParam) return TRUE; hToolTipWnd = hWnd; return FALSE; } 

我不知道您要检索其工具提示的窗口是否是您创建的窗口的子窗口。

如果是这种情况,您可以处理NM_TOOLTIPSCREATED通知,该通知由子窗口在创建工具提示时发送给其父窗口(或者应该发送:对于常见控件是正确的,但我不知道其他类型的视窗)。 此通知包括工具提示窗口的句柄。