Question balloon e tray icon su windows 7

  • sabato 5 dicembre 2009 15:18
     
     
    salve a tutti,
    volevo sapere se conoscevate un modo per far comparire un "balloon message" dalla una icona nel tray, tutto su windows 7.
    questa è il metodo che ho scritto che sembra girare su windows xp, ma su 7 niente da fare.

    BOOL ShowBalloon(NOTIFYICONDATAA *pnidIconInfo, char *szBalloonTitle, char *szBalloonMsg, DWORD dwIcon, UINT nTimeOut){
      
        BOOL bBalloonShown = FALSE;
       
        if (pnidIconInfo != NULL){
            pnidIconInfo->dwInfoFlags = dwIcon;
        }
        else{
            return bBalloonShown; // We could not get the NOTIFYICONDATA
        }
       
        // Set the flags for showing balloon, espcially NIF_INFO
        pnidIconInfo->uFlags |= NIF_INFO;
       
        // Set the time out for the balloon
        pnidIconInfo->uTimeout = nTimeOut;

        // Set the balloon title
        strcpy(pnidIconInfo->szInfoTitle, szBalloonTitle);

        // Set balloon message
        strcpy(pnidIconInfo->szInfo, szBalloonMsg);

        // Show balloon....
        bBalloonShown = ::Shell_NotifyIconA(NIM_MODIFY, pnidIconInfo);
        bBalloonShown = Shell_NotifyIconA(NIN_BALLOONSHOW, pnidIconInfo);
           
        return bBalloonShown; 
    }

    qualsiasi aiuto è ben voluto...

Tutte le risposte

  • domenica 6 dicembre 2009 16:18
     
      Contiene codice
    La prima cosa che io farei nel tuo codice è rimuovere la gestione delle stringhe ANSI/MBCS (ovvero char*, NOTIFYICONDATAA, strcpy, Shell_NotifyIconA...).
    Siamo nel 2009 (e hai come target Windows 7, non Windows 95/98), per cui è opportuno usare stringhe Unicode (ovvero WCHAR *, etc.).

    Inoltre, c'è un problema di const-correctness sui parametri in input. 
    Ad esempio szBalloonTitle è dichiarato come char*, invece dovrebbe essere const char * (o, meglio, considerato quanto scritto nel paragrafo precedente, const WCHAR *, ovvero LPCWSTR).

    Ancora, c'è un problema con l'uso di funzioni obsolete e non sicure come strcpy. Ti consiglio vivamente di usare funzioni della nuova Safe String Library, come StringCchCopy.

    Questo codice compilato con VS2008 SP1 funziona correttamente sulla mia copia di Windows 7:

    BOOL ShowBalloon(LPCWSTR pszTitle, LPCWSTR pszText, DWORD dwIcon)
    {
        NOTIFYICONDATA nid = {sizeof(nid)};
        nid.uFlags = NIF_INFO | NIF_GUID;
        nid.guidItem = __uuidof(PrinterIcon);
        nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON;
        StringCchCopy(nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle), pszTitle);
        StringCchCopy(nid.szInfo, ARRAYSIZE(nid.szInfo), pszText);
        LoadIconMetric(g_hInst, MAKEINTRESOURCE(dwIcon), LIM_LARGE, &nid.hBalloonIcon);
        return Shell_NotifyIcon(NIM_MODIFY, &nid);
    }
    
    BOOL ShowPrintJobBalloon()
    {
        return ShowBalloon( L"Some title", L"Some text...", IDI_NOTIFICATIONICON );
    }

    Ecco come appare in questo screenshot.

    Ho semplicemente eseguito un piccolo refactoring (per isolare i parametri pszTitle e pszText) su un codice presente in un esempio fornito con il Windows 7 SDK: NotificationIcon (si trova in C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\winui\shell\appshellintegration oppure online su CodeGallery).
    (L'esempio originale usa LoadString per caricare le stringhe da risorse.)


    HTH,
    Giovanni