2009-08-26 20 views
4

私は、与えられたHWNDに関連付けられているツールヒントコントロール(もしあれば)を取得する方法を探しています。ツールヒントコントロールのテキストでも十分です。私が見つけた最も近いものはTTM_GETTEXTメッセージですが、関連付けられているツールの代わりにツールチップコントロール自体に送信されることを意図しています。私はツールチップコントロールへのハンドルを持っていません。誰もこれを行う方法を知っていますか?与えられたHWNDのツールチップテキストを取得するには?

これはすべて、C++のプレーンWindows APIを使用して行われます。

答えて

2

あり、先端またはコントロールからそのテキストを取得するために特定のメッセージのように見えるが、MFCのCWndのクラスが実装してどのようにこれは、あなたは、Win32に適応することができるはずOnToolHitTest()、ではありません。

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メッセージを使用できます。これはツールヒントコントロールで使用するように設計されていますが、他の場所から送信できない理由はわかりません。

+2

面白そうです - 残念ながら、ツールチップのTOOLINFO :: lpszTextフィールドがLPSTR_TEXTCALLBACKに設定されている場合にのみ、ツールチップによって送信されます。したがって、ツールチップが表示されるたびに、コントロールにテキストが表示されるように要求されます。たぶんこれは一般的なケースです(私もそうだと思います)。静的なテキスト(TOOLINFO :: lpszTextは静的な文字列に設定されています)のツールチップがたくさんあります。 –

1

必要なウィンドウの親を持つツールチップコントロールを探してウィンドウを列挙できます。あなたは...(通常GetDlgCtrlIDから)ツールIDと一緒に窓を供給する必要があります:

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通知を処理できます(または送信する必要があります。一般的なコントロールではtrueですが、わかりません他の種類の窓用)。この通知にはツールヒントウィンドウのハンドルが含まれています。

関連する問題