我正在尋找一種方法來獲取與給定HWND關聯的工具提示控件(如果有的話)。工具提示控件的文本也是足夠的。我發現的最接近的消息是TTM_GETTEXT消息,但它意味着被髮送到工具提示控件本身,而不是與其關聯的工具。儘管我沒有處理工具提示控制。有人知道怎麼做這個嗎?如何獲取給定HWND的工具提示文本?
這一切都是使用普通的Windows API在C++中完成的。
我正在尋找一種方法來獲取與給定HWND關聯的工具提示控件(如果有的話)。工具提示控件的文本也是足夠的。我發現的最接近的消息是TTM_GETTEXT消息,但它意味着被髮送到工具提示控件本身,而不是與其關聯的工具。儘管我沒有處理工具提示控制。有人知道怎麼做這個嗎?如何獲取給定HWND的工具提示文本?
這一切都是使用普通的Windows API在C++中完成的。
似乎沒有成爲一個特定的消息,以獲得尖端或從控制它的文本,但是這是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
}
希望這將是有益的。
要得到一定的控制,你可以使用TTN_NEEDTEXT
消息提示文本。它被設計爲被ToolTip控件使用,但是我看不出有什麼理由不能將它從其他地方發送出去。
看起來很有趣 - 不幸的是,如果提示的TOOLINFO :: lpszText字段設置爲LPSTR_TEXTCALLBACK唯一被提示發送。所以每次顯示工具提示時,都會要求控件顯示文本。也許這是常見的情況(我希望如此),但我懷疑仍然有很多工具提示有靜態文本(即TOOLINFO :: lpszText設置爲靜態字符串)。 –
你可以列舉尋找具有所需窗口的父項的工具提示控制的窗口。你需要用工具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函數可能會注意到沒有工具提示窗口句柄。 –
我不知道,如果你想檢索其提示的窗口是一個窗口的孩子,你已經創造出來了。
如果是這種情況,您可以處理NM_TOOLTIPSCREATED通知,該通知由子窗口在創建工具提示時發送給它的父項(或者應該發送:對於常見控件是這樣,但我不知道對於其他類型的窗戶)。此通知包含工具提示窗口的句柄。
啊,有意思!好主意看看 - 這是我第一次看到LPSTR_TEXTCALLBACK。 –