Why aren't Shell_NotifyIcon balloon tips working?

According to everything I've seen, the following C++ program should be displaying a balloon tool tip from the tray icon when I left-click in the application window, yet it's not working. Can anyone tell me what I'm missing?

This is on XP with version 6.0 of Shell32.dll (verified with DllGetVersion).

Additionally, I do not have the registry key in HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced that turns off balloon tips.

Thanks!
#include "stdafx.h"
#include "shellapi.h"
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
int APIENTRY WinMain(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;
}

Open in new window

LVL 1
wdbdesignAsked:
Who is Participating?
 
wdbdesignAuthor Commented:
Bah, I figured it out.  For some reason with the headers I have...

sizeof(NOTIFYICONDATA) == 508

whereas...

NOTIFYICONDATA_V3_SIZE == 504
NOTIFYICONDATA_V2_SIZE == 488
NOTIFYICONDATA_V1_SIZE == 88

If I specify either V2 or V3 instead of sizeof(NOTIFYICONDATA) the balloon tips show up just fine.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.