【问题标题】:Showing a tooltip via TTM_TRACKACTIVATE does not work通过 TTM_TRACKACTIVATE 显示工具提示不起作用
【发布时间】:2015-05-15 06:47:41
【问题描述】:

在后台进程中,我想在托盘区域显示我像气球一样的短消息。但是,我不想为此添加托盘图标。 因此,我创建了一个工具提示图标并希望将其放置在托盘附近。 但是,发送TTM_UPDATETIPTEXTTTM_TRACKPOSITIONTTM_TRACKACTIVATE 返回 0。虽然我不确定这是否应该是这种情况,但以下代码确实显示工具提示窗口,我不不知道为什么:

这是代码:

// "hwnd" is the HWND to the hidden background window of my background process
HWND hTrayWnd = FindWindow(_T("Shell_TrayWnd"), NULL);
GetWindowRect(hTrayWnd, &trayPos);
HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
    WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    hWnd, NULL, NULL, NULL);
LRESULT ret;
TOOLINFO toolInfo = { 0 };
ZeroMemory(&toolInfo, sizeof(toolInfo));
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hinst = GetModuleHandle(NULL);
toolInfo.lpszText = _T("Test Test");
toolInfo.hwnd = hWnd;
ret = SendMessage(hwndTip, TTM_SETTITLE, TTI_INFO , (LPARAM)_T("Test Title"));

此调用返回零:

ret = SendMessage(hwndTip, TTM_UPDATETIPTEXT, 0 , (LPARAM)&toolInfo); // needs hinst, lpszText, hwnd, cbSize

这个调用也返回零:

ret = SendMessage(hwndTip, TTM_TRACKPOSITION, 0, MAKELPARAM(trayPos.left, trayPos.top));
ZeroMemory(&toolInfo, sizeof(toolInfo));
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hWnd;
toolInfo.uId = 1;

还有这个:

ret = SendMessage(hwndTip, TTM_TRACKACTIVATE, TRUE, (LPARAM)&toolInfo); // needs hwnd, uId, cbSize

而且工具提示窗口永远不会显示。

我还尝试使用TTM_ADDTOOL(如评论中所建议的那样)广告我的SendMessage 调用的不同顺序,但这也返回零并且不显示任何工具提示:

LRESULT ret;
TOOLINFO toolInfo = { 0 };
ZeroMemory(&toolInfo, sizeof(toolInfo));
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.lpszText = _T("Test Test");
toolInfo.hwnd = hWnd;
toolInfo.uId = 1;
toolInfo.rect.bottom = trayPos.bottom;
toolInfo.rect.left = trayPos.left;
toolInfo.rect.right = trayPos.right;
toolInfo.rect.top = trayPos.top;

//ret = SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
ret = SendMessage(hwndTip, TTM_SETTITLE, TTI_INFO , (LPARAM)_T("Test Title"));
//ret = SendMessage(hwndTip, TTM_UPDATETIPTEXT, 0 , (LPARAM)&toolInfo); // needs hinst, lpszText, hwnd, uId, cbSize
//ret = SendMessage(hwndTip, TTM_TRACKPOSITION, 0, MAKELPARAM(trayPos.left, trayPos.top));
//ret = SendMessage(hwndTip, TTM_TRACKACTIVATE, TRUE, (LPARAM)&toolInfo); // needs hwnd, uId, cbSize
ret = SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);

【问题讨论】:

  • 与您的问题无关,但您似乎对填充TOOLINFO structure 感到有些困惑。无需设置 hinst 成员,除非您为 lpszText 指定字符串资源标识符(您不是)。将结构归零两次也很尴尬。
  • 感谢您的提示。实际上,我不确定TTM_UPDATETIPTEXTTTM_TRACKPOSITIONTTM_TRACKACTIVATE 是否应该首先返回非零值。在任何情况下,显示的代码都没有显示工具提示......我更新了问题。
  • 您是否曾经使用TTM_ADDTOOL 将工具提示添加到控件?
  • 不,但我确实想将它附加到控件上!我想在没有托盘图标的情况下“模拟”托盘中的气球,所以据我所知,只需 TTM_TRACKACTIVATE 即可完成这项工作......
  • “到控件”是指“到工具提示控件”;你不能 TTM_TRACKACTIVATE 到无法识别的工具提示。您不需要将工具提示附加到控件,但您确实需要注册它。不要指定TTF_IDISHWND,将uId 设置为一些用于识别工具的整数,并将hwnd 设置为应用程序的主窗口(我认为)。

标签: winapi tooltip balloon-tip


【解决方案1】:

TTM_TRACKACTIVATE 激活一个“跟踪工具提示”,它是通过在TOOLINFO::uFlags 中设置TTF_TRACK 创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多