Frage

Nach allem, was ich gesehen habe, das folgende C ++ Programm sollte einen Ballon Werkzeugspitze aus dem Tray-Icon sein anzuzeigen, wenn ich die linken Maustaste in dem Anwendungsfenster, aber es funktioniert nicht. Kann mir jemand sagen, was ich bin fehlt?

Dies ist auf XP mit Version 6.0 von Shell32.dll (überprüft mit DllGetVersion).

Danke!

    #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;
    }
War es hilfreich?

Lösung

Bah, ich es herausgefunden. Aus irgendeinem Grunde mit dem Header Ich habe ...

sizeof (NOTIFYICONDATA) == 508

während ...

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

Wenn ich angeben entweder V2 oder V3 statt sizeof (NOTIFYICONDATA) die Ballonspitzen zeigen sich gut.

Andere Tipps

Haben Sie in der Registrierung überprüft unter ...

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Currentversion \ Explorer \ Erweitert

... für EnableBalloonTips? Es ist etwas sehr häufig für Benutzer zu deaktivieren.

Das Problem ist, dass Sie gehen davon aus Fenster, die Sie senden WM_LBUTTONDOWN wird, wenn der Benutzer auf das Symbol klicken, aber das ist nicht richtig. WM_LBUTTONDOWN wird nur gesendet, wenn der Benutzer innerhalb der Client-Bereichs der hWnd klickt, wenn Sie sorgfältig die Dokumentation von NOTIFYICONDATA lesen, werden Sie feststellen, dass, wenn der Benutzer auf das Symbol klickt Windows-Sie senden WM_USER+20 Nachricht (nach Ihrem Code) und in dem lParam Paramter Sie erhalten die WM_LBUTTONDOWN Benachrichtigung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top