Почему не работают всплывающие подсказки Shell_NotifyIcon?
В соответствии со всем, что я видел, следующая программа C++ должна отображать всплывающую подсказку со значком в трее, когда я щелкаю левой кнопкой мыши в окне приложения, но она не работает. Кто-нибудь может сказать мне, что мне не хватает?
Это на XP с версией 6.0 Shell32.dll (проверено с помощью DllGetVersion).
Спасибо!
#include "stdafx.h"
#include "shellapi.h"
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "sysTrayTest";
RegisterClass(&wc);
HWND hWnd = CreateWindow("sysTrayTest", "",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 500, 500,
NULL, NULL, hInstance, NULL);
if (hWnd)
{
ShowWindow(hWnd, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
{
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 1;
Shell_NotifyIcon(NIM_DELETE, &nid);
PostQuitMessage(0);
}
break;
case WM_CREATE:
{
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_USER + 200;
nid.hIcon = LoadIcon(NULL, IDI_INFORMATION);
lstrcpy (nid.szTip, "Test Tip");
Shell_NotifyIcon(NIM_ADD, &nid);
}
break;
case WM_LBUTTONDOWN:
{
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 1;
nid.uFlags = NIF_INFO;
lstrcpy(nid.szInfo, "Test balloon tip");
lstrcpy(nid.szInfoTitle, "Test Title");
nid.dwInfoFlags = NIIF_INFO;
nid.uTimeout = 15000;
Shell_NotifyIcon(NIM_MODIFY, &nid);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
3 ответа
Бах, я понял это. По некоторым причинам с заголовками у меня есть...
sizeof(NOTIFYICONDATA) == 508
в то время как...
NOTIFYICONDATA_
V3_
РАЗМЕР == 504
NOTIFYICONDATA_
V2_
РАЗМЕР == 488
NOTIFYICONDATA_
V1_
РАЗМЕР == 88
Если я указываю V2 или V3 вместо sizeof(NOTIFYICONDATA), всплывающие подсказки отображаются просто отлично.
Вы проверили в реестре под...
HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Advanced
... для подсказок EnableBalloon? Пользователи часто отключаются.
Проблема в том, что вы предполагаете, что Windows отправит вам WM_LBUTTONDOWN
когда пользователь нажимает на значок, но это не правильно. WM_LBUTTONDOWN
отправляется только тогда, когда пользователь щелкает внутри клиентской области hWnd, если вы внимательно прочитали документацию NOTIFYICONDATA
вы поймете, что когда пользователь нажимает значок Windows отправит вам WM_USER+20
сообщение (согласно вашему коду) и в параметре lParam вы получите WM_LBUTTONDOWN
уведомление.