为什么Shell_NotifyIcon气球提示不起作用?

时间:2009-04-22 04:37:38

标签: c++ winapi tooltip windows-shell notifyicon

根据我所看到的一切,当我在应用程序窗口中单击鼠标左键时,以下C ++程序应该从托盘图标显示气球工具提示,但它不起作用。谁能告诉我我错过了什么?

这是在XP上的Shell32.dll 6.0版本(通过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 个答案:

答案 0 :(得分:13)

巴哈,我明白了。出于某种原因我有标题......

sizeof(NOTIFYICONDATA)== 508

...而

NOTIFYICONDATA _ V3 _ SIZE == 504
NOTIFYICONDATA _ V2 _ SIZE == 488
NOTIFYICONDATA _ V1 _ SIZE == 88

如果我指定V2或V3而不是sizeof(NOTIFYICONDATA),气球提示就会显示正常。

答案 1 :(得分:1)

您是否在...下注册了注册表。

HKEY_CURRENT_USER \软件\微软\的Windows \ CurrentVersion \ Explorer中\高级

...对于EnableBalloonTips?这是用户关闭的常见问题。

答案 2 :(得分:1)

问题是您假设Windows在用户点击图标时会向您发送WM_LBUTTONDOWN,但这不正确。只有当用户在hWnd的客户区域内点击时才会发送WM_LBUTTONDOWN,如果您仔细阅读NOTIFYICONDATA的文档,您会发现当用户点击该图标时,Windows会向您发送WM_USER+20消息(根据您的代码),在lParam参数中,您将收到WM_LBUTTONDOWN通知。