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