Как получить текст всплывающей подсказки для заданного HWND? - PullRequest
4 голосов
/ 26 августа 2009

Я ищу способ получить всплывающую подсказку (если есть), которая связана с данным HWND. Текст элемента управления всплывающей подсказки тоже будет достаточно. Самое близкое, что я нашел, - это сообщение TTM_GETTEXT , но оно предназначено для отправки самому элементу управления всплывающей подсказки вместо инструмента, с которым он связан. У меня нет ручки для управления всплывающей подсказки, хотя. Кто-нибудь знает, как это сделать?

Все это делается с помощью простого Windows API в C ++.

Ответы [ 4 ]

2 голосов
/ 26 августа 2009

Кажется, что нет конкретного сообщения, чтобы получить подсказку или ее текст из элемента управления, но именно так класс CWnd MFC реализует 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
}

Надеюсь, это будет полезно.

1 голос
/ 25 октября 2009

Я не знаю, является ли окно, подсказку которого вы хотите получить, дочерним по отношению к созданному вами окну.

Если это так, вы можете обработать уведомление NM_TOOLTIPSCREATED, которое отправляется дочерним окном его родителю при создании всплывающей подсказки (или должно быть отправлено: это верно для общих элементов управления, но я не знаю другие виды окон). Это уведомление содержит дескриптор окна всплывающей подсказки.

1 голос
/ 24 октября 2009

Вы можете перечислить окна, ища элемент управления всплывающей подсказки, у которого есть родительский элемент для требуемого окна. Вам нужно будет указать окно вместе с идентификатором инструмента (обычно от 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 голос
/ 26 августа 2009

Чтобы получить текст всплывающей подсказки из какого-либо элемента управления, вы можете использовать сообщение TTN_NEEDTEXT. Он был разработан для использования элементом управления ToolTip, но я не вижу причин, по которым вы не можете отправить его из другого места.

...