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

4
我正在寻找一种方法来获取与给定HWND相关联的工具提示控件(如果有)。 工具提示控件的文本也足够了。 我发现的最接近的东西是TTM_GETTEXT消息,但它是发送到工具提示控件本身而不是与之关联的工具。 虽然我没有工具提示控件的句柄。 有人知道如何做到这一点吗?
所有这些都是使用C ++中的纯Windows API完成的。
4个回答

2

似乎没有从控件获取提示或其文本的特定消息,但这是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
}

希望这对您有所帮助。

啊,有趣!看那儿是个好主意——这是我第一次见到LPSTR_TEXTCALLBACK。 - Frerich Raabe

1

您可以枚举窗口,寻找具有所需窗口父级的工具提示控件。您需要提供窗口以及工具 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;
}

1
不幸的是,这似乎需要工具提示可见。否则,就没有工具提示窗口句柄,FindToolTip函数可以注意到。 - Frerich Raabe

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

2
看起来很有趣 - 不幸的是,它只能通过工具提示发送,如果工具提示的TOOLINFO :: lpszText字段设置为LPSTR_TEXTCALLBACK。因此,每次显示工具提示时,它都会向控件请求要显示的文本。也许这是常见情况(我希望如此),但我怀疑仍然有很多工具提示使用静态文本(即TOOLINFO :: lpszText设置为静态字符串)。 - Frerich Raabe

1

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

如果是这种情况,你可以处理NM_TOOLTIPSCREATED通知,该通知由子窗口发送到其父窗口,当它创建一个工具提示时(或应该发送:对于公共控件是正确的,但我不知道其他类型的窗口)。此通知包括指向工具提示窗口的句柄。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接