title: Why aren't Shell_NotifyIcon balloon tips working?
body: <p>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?</p>
  
  <p>This is on XP with version 6.0 of Shell32.dll (verified with DllGetVersion).</p>
  
  <p>Thanks!</p>
  
  <pre><code>    #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(&amp;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(&amp;wc);
  
          HWND hWnd = CreateWindow("sysTrayTest", "", 
                                  WS_OVERLAPPEDWINDOW,
                                  CW_USEDEFAULT, 0, 500, 500, 
                                  NULL, NULL, hInstance, NULL);
          if (hWnd)
          {
              ShowWindow(hWnd, nCmdShow);
              while (GetMessage(&amp;msg, NULL, 0, 0))
              {
                  TranslateMessage(&amp;msg);
                  DispatchMessage(&amp;msg);
              }
          }
  
          return 0;
      }
  
      LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
          switch (message)
          {
              case WM_DESTROY:
              {
                  NOTIFYICONDATA nid;
                  memset(&amp;nid, 0, sizeof(NOTIFYICONDATA));
                  nid.cbSize = sizeof(NOTIFYICONDATA);
                  nid.hWnd = hWnd;
                  nid.uID = 1;
                  Shell_NotifyIcon(NIM_DELETE, &amp;nid);
  
                  PostQuitMessage(0);
              }
              break;
  
              case WM_CREATE:
              {
                  NOTIFYICONDATA nid;
                  memset(&amp;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, &amp;nid);
              }
              break;
  
              case WM_LBUTTONDOWN:
              {
                  NOTIFYICONDATA nid;
                  memset(&amp;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, &amp;nid);
              }
              break;
  
              default:
                  return DefWindowProc(hWnd, message, wParam, lParam);
          }
          return 0;
      }
  </code></pre>