2009-08-26 24 views
4

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

这一切都是使用普通的Windows API在C++中完成的。

回答

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 
} 

希望这将是有益的。

+0

啊,有意思!好主意看看 - 这是我第一次看到LPSTR_TEXTCALLBACK。 –

1

要得到一定的控制,你可以使用TTN_NEEDTEXT消息提示文本。它被设计为被ToolTip控件使用,但是我看不出有什么理由不能将它从其他地方发送出去。

+2

看起来很有趣 - 不幸的是,如果提示的TOOLINFO :: lpszText字段设置为LPSTR_TEXTCALLBACK唯一被提示发送。所以每次显示工具提示时,都会要求控件显示文本。也许这是常见的情况(我希望如此),但我怀疑仍然有很多工具提示有静态文本(即TOOLINFO :: lpszText设置为静态字符串)。 –

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函数可能会注意到没有工具提示窗口句柄。 –

1

我不知道,如果你想检索其提示的窗口是一个窗口的孩子,你已经创造出来了。

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