簡體   English   中英

如何獲取給定 HWND 的工具提示文本?

[英]How to get tooltip text for a given 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_TOOLTIPSSCREATED 通知,該通知由子窗口在創建工具提示時發送到其父窗口(或應該發送:對於常見控件是正確的,但我不知道其他類型的視窗)。 此通知包括工具提示窗口的句柄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM