【问题标题】:How to get tooltip text for a given HWND?如何获取给定 HWND 的工具提示文本?
【发布时间】:2010-11-22 22:57:15
【问题描述】:

我正在寻找一种方法来获取与给定 HWND 关联的工具提示控件(如果有)。工具提示控件的文本也足够了。我发现最接近的是TTM_GETTEXT 消息,但它是要发送到工具提示控件本身而不是与其关联的工具。不过,我没有工具提示控件的句柄。有人知道怎么做吗?

所有这些都是使用 C++ 中的普通 Windows API 完成的。

【问题讨论】:

    标签: c++ c winapi tooltip hwnd


    【解决方案1】:

    似乎没有特定的消息可以从控件中获取提示或其文本,但这是 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。
    【解决方案2】:

    要从某个控件获取工具提示文本,您可以使用TTN_NEEDTEXT 消息。它被设计为供 ToolTip 控件使用,但我看不出您无法从其他地方发送它的任何原因。

    【讨论】:

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

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

    【讨论】:

    • 不幸的是,这似乎要求工具提示是可见的。否则,没有FindToolTip 函数可以注意到的工具提示窗口句柄。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 2014-12-13
      • 2013-07-25
      • 1970-01-01
      • 2020-02-10
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多