2009-08-26 2 views
4

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

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

ответ

2

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

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

+0

А, интересно! Хорошая идея посмотреть там - это первый раз, когда я вижу LPSTR_TEXTCALLBACK. –

1

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

+2

Выглядит интересно - к сожалению, он отправляется только всплывающей подсказкой, если поле TOOLINFO :: lpszText всплывающей подсказки было установлено на LPSTR_TEXTCALLBACK. Поэтому каждый раз, когда отображается всплывающая подсказка, она запрашивает элемент управления для отображения текста. Может быть, это общий случай (надеюсь, так), но я подозреваю, что есть еще много подсказок, которые имеют статический текст (т. Е. TOOLINFO :: lpszText устанавливается в статическую строку). –

1

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

1

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

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