Отображение всплывающей подсказки через TTM_TRACKACTIVATE не работает

В фоновом процессе я хочу отобразить короткое сообщение, похожее на воздушный шар, в области трея. Однако я не хочу добавлять значок в трее только для этого. Поэтому я создаю значок всплывающей подсказки и хочу разместить его рядом с треем. Однако отправка TTM_UPDATETIPTEXT, TTM_TRACKPOSITION, TTM_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);

person divB    schedule 15.05.2015    source источник
comment
Не имеет отношения к вашему вопросу, но вы, кажется, несколько смущены заполнением Структура TOOLINFO. Нет необходимости устанавливать элемент hinst, если только вы не укажете строковый идентификатор ресурса для lpszText (которым вы не являетесь). Дважды обнулять структуру также неудобно.   -  person IInspectable    schedule 15.05.2015
comment
Спасибо за подсказку. На самом деле, я не уверен, что TTM_UPDATETIPTEXT, TTM_TRACKPOSITION, TTM_TRACKACTIVATE вообще должны возвращать ненулевое значение. В любом случае показанный код не показывает всплывающую подсказку... Я обновил вопрос.   -  person divB    schedule 15.05.2015
comment
Вы когда-нибудь использовали TTM_ADDTOOL для добавления всплывающей подсказки к элементу управления?   -  person andlabs    schedule 15.05.2015
comment
Нет, но я не хочу присоединять его к элементу управления! Я хочу имитировать воздушный шар в трее без значка в трее, поэтому, как я понимаю, просто TTM_TRACKACTIVATE должен выполнять эту работу...   -  person divB    schedule 16.05.2015
comment
Под элементом управления я имел в виду элемент управления всплывающей подсказкой; вы не можете TTM_TRACKACTIVATE использовать всплывающую подсказку, которую невозможно идентифицировать. Вам не нужно прикреплять всплывающую подсказку к элементу управления, но вам необходимо зарегистрировать ее. Не указывайте TTF_IDISHWND, установите uId на некоторое целое число, которое будет использоваться для идентификации инструмента, и установите hwnd на главное окно вашего приложения (я думаю).   -  person andlabs    schedule 16.05.2015
comment
Спасибо - я пытался отправить TTM_ADDTOOL до и после этого, но без изменений. Я изменил сообщение соответственно.   -  person divB    schedule 18.05.2015


Ответы (1)


TTM_TRACKACTIVATE активирует «подсказку отслеживания», которая создается путем установки TTF_TRACK в TOOLINFO::uFlags.

person javs    schedule 11.03.2020