Tray-Icon Baloon-Tooltip



  • Hallo,

    ich bin gerade dabei ein kleines Programm zu schreiben (oder daran zu verzweifeln), welches eine Datei auslesen und z.B. jede Minute eine Zeile der Datei als so ein Baloon-Tooltip auszugeben. Es muss halt die Textzeile im Vordergrund, nicht störend sichtbar sein.

    Doch leider scheitere ich schon bei der Ausgabe. Ich bin schon so weit, dass ich weiß, dass sog. Tray-Icons diese Baloon-Tooltips erzeugen können. Da ich noch keinerlei Erfahrungen mit C++ bisher habe, habe ich mit Dev C++ einfach mal eine neue Windows Applikation geöffnet und dort folgenden Code reinkopiert:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-155222.html
    Das sieht bei mir mittlerweile so aus:

    #include <windows.h>
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    
        //*****************************************************************************
        //*
        //*
        //*     TaskbarTools
        //*
        //*
        //*****************************************************************************
        //
        //  Funktionen für die Steuerung der Taskbar
        //
        //      BOOL    TaskbarHide(HWND Hwnd)      Taste in der Taskbar verstecken
        //      BOOL    TaskbarShow(HWND Hwnd)      Taste in der Taskbar anzeigen
        //
        //  Nachrichten Verarbeitung:
        //
        //      ON_MESSAGE(TB_NOTIFYICON, OnProc)
        //
        //      void OnProc(UINT wParam,UINT lParam)    // lParam ist die ID
        //          {
        //          switch(lParam)
        //              {
        //          case WM_LBUTTONDOWN:
        //          case WM_RBUTTONDOWN:
        //              }
        //          }
    
        #ifndef     __TASKBARTOOLS_H__
        #define     __TASKBARTOOLS_H__
    
        #define     TB_NOTIFYICON       0x2F19
    
        BOOL         TaskbarInit();
        void __cdecl TaskbarExit(void);
    
        BOOL TaskbarHide(HWND Hwnd);
        BOOL TaskbarShow(HWND Hwnd);
    
        #endif 
    
        //*****************************************************************************
        //*
        //*
        //*     TaskbarTools
        //*
        //*
        //*****************************************************************************
        //
        //  Funktionen für die Steuerung der Taskbar
        //
        //      BOOL    TaskbarHide(HWND Hwnd)      Taste in der Taskbar verstecken
        //      BOOL    TaskbarShow(HWND Hwnd)      Taste in der Taskbar anzeigen
        //
    
        #include    <windows.h>
        #include    <shellapi.h>
        #include    <shlwapi.h>
        #include    <shlobj.h>
        #include    <string.h>
        #include    "TaskbarTools.h"
    
        typedef struct ITaskbarListVtbl
            {
            BEGIN_INTERFACE
    
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( VOID __RPC_FAR * This,REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject);
            ULONG   ( STDMETHODCALLTYPE __RPC_FAR *AddRef         )( VOID __RPC_FAR * This);
            ULONG   ( STDMETHODCALLTYPE __RPC_FAR *Release        )( VOID __RPC_FAR * This);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HrInit         )( VOID __RPC_FAR * This);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddTab         )( VOID __RPC_FAR * This, HWND hwnd);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DeleteTab      )( VOID __RPC_FAR * This, HWND hwnd);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ActivateTab    )( VOID __RPC_FAR * This, HWND hwnd);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetActiveAlt   )( VOID __RPC_FAR * This, HWND hwnd);
    
            END_INTERFACE
            } ITaskbarListVtbl;
    
        typedef struct
            {
            ITaskbarListVtbl    *lpVtbl;
            }ITaskbarList_;
    
        static  ITaskbarList_   *list=0;
        static  int exit_add=0;
    
        //*****************************************************************************
        //*
        //*     TaskbarInit
        //*
        //*****************************************************************************
        //  Initialisiert die Taskbar Routienen
        //  Ergibt TRUE wenn erfolgreich
        BOOL TaskbarInit()
        {
        HRESULT hr;
    
            if(list)return TRUE;
    
            hr=CoInitialize( NULL );
            if(!SUCCEEDED(hr))return FALSE;
    
            hr=CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList,(void**)&list);
            if(!SUCCEEDED(hr))return FALSE;
    
        return TRUE;
        }
    
        //*****************************************************************************
        //*
        //*     TaskbarExit
        //*
        //*****************************************************************************
        //  Deinitialisiert die Taskbar Routienen
        void __cdecl TaskbarExit(void )
        {
            if(!list)return;
    
            CoUninitialize();
            list=0;
        }
    
        //*****************************************************************************
        //*
        //*     TaskbarHide
        //*
        //*****************************************************************************
        //  Versteckt die Taskleiste die zu Hwnd gehört
        //  Ergibt TRUE wenn erfolgreich
        BOOL TaskbarHide(HWND Hwnd)
        {
        HRESULT hr;
    
            if(!list)
                {
                if(!TaskbarInit())return FALSE;
                if(!exit_add){atexit(TaskbarExit);exit_add=1;}
                }
    
            hr=list->lpVtbl->DeleteTab(list,Hwnd);
            if(!SUCCEEDED(hr))return FALSE;
    
        return TRUE;
        }
    
        //*****************************************************************************
        //*
        //*     TaskbarShow
        //*
        //*****************************************************************************
        //  Erstellt eine Taste in der Taskleiste die zu Hwnd gehört
        //  Ergibt TRUE wenn erfolgreich
        BOOL TaskbarShow(HWND Hwnd)
        {
        HRESULT hr;
    
            if(!list)
                {
                if(!TaskbarInit())return FALSE;
                if(!exit_add){atexit(TaskbarExit);exit_add=1;}
                }
            hr=list->lpVtbl->AddTab(list,Hwnd);
            hr=list->lpVtbl->ActivateTab(list,Hwnd);
            if(!SUCCEEDED(hr))return FALSE;
    
        return TRUE;
        }
    

    Doch, aber was hätte ich anderes erwarten sollen, es funktioniert nicht.
    Folgende Fehler treten auf:

    152 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp TaskbarTools.h: No such file or directory. 
     C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp In function `BOOL TaskbarInit()': 
    200 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp `CLSID_TaskbarList' undeclared (first use this function) 
      (Each undeclared identifier is reported only once for each function it appears in.) 
    200 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp `IID_ITaskbarList' undeclared (first use this function) 
     C:\Users\Felk\Desktop\dev_cpp\proj1\Makefile.win [Build Error]  [main.o] Error 1
    

    Ich hoffe ihr könnt mir sagen, was ich falsch mache und mich auf den richtigen Weg leiten 🙂
    Danke im Voraus!


  • Mod

    Die Fehlermeldung ist ja wohl eindeutig. Du musst deiner IDE beibringen, wie sie die Datei findet. Du sagst, du benutzt Dev C++, dazu fällt mir auch folgender wichtiger Thread ein:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-237002.html



  • Ich habe den ultimativen Tipp für dich:

    152 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp TaskbarTools.h: No such file or directory.
    

    Und noch ein Tipp am Rande: Durch Kopieren lernst du nicht Programmieren.



  • okay, erstmal danke 🙂

    also erstmal hab ich mir mal codeLite runtergeladen, mal sehen.
    Und dass ich durch kopieren nichts lerne stimmt nur grob 🙂
    Auf jeden Fall ist mir sowas wie "no such file or directory" schon von php ein begriff (php wird ja in c++ interpretiert soweit ich weiß und spuckt die gleichen fehlermeldungen aus). Aber wo sollte ich diese Datei herkriegen? Und wie soll sie das IDE finden?

    Ich werde das nochmal mit CodeLite probieren. Und @SeppJ was meinst du damit? Kann man irgendwo dem Projekt Ressourcen o.ä. hinzufügen? Ich finde diese TaskbarTools.h (in Dev C++) einfach nicht. Vielleicht gibt es die ja in CodeLite :S
    (40% gedownloadet :))



  • Felk schrieb:

    Und dass ich durch kopieren nichts lerne stimmt nur grob 🙂

    Das stimmt definitiv. Du siehst ja nicht mal, dass du mehrere Dateien in eine einzige Datei reinkopiert hast und die entsprechende Datei, die nicht gefunden wird, mitten in deinem Code steht.



  • Oh... an sowas hatte ich garnicht gedacht 😞
    also macht schonmal 1 Problem weniger. Aber was ist mit den anderen Fehlermeldungen?
    CLSID_TaskbarList und IID_ITaskbarList sind undeklariert.
    Wenn ich sie einfach mit z.B. CLSID CLSID_TaskbarList; deklariere sind diese Fehler zwar weg (obwohl ich an der richtigkeit von "CLSID" und "IID" zweifle), aber ich bekomme ein paar Linker-errors...



  • bitte helft mir doch 😞
    ich will mir nämlich einfach einen vokabeltrainer machen, der mir alle 5 minuten oder so eine vokabel als baloon-tooltip einblendet.
    Doch dazu muss das Teil funktionieren und ich wollte dafür eigentlich nicht gleich C++ lernen müssen 😞

    C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp In function `BOOL TaskbarInit()': 
    69 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp `CLSID_TaskbarList' undeclared (first use this function) 
      (Each undeclared identifier is reported only once for each function it appears in.) 
    69 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp `IID_ITaskbarList' undeclared (first use this function) 
     C:\Users\Felk\Desktop\dev_cpp\proj1\Makefile.win [Build Error]  [main.o] Error 1
    
    //*****************************************************************************
        //*
        //*
        //*     TaskbarTools
        //*
        //*
        //*****************************************************************************
        //
        //  Funktionen für die Steuerung der Taskbar
        //
        //      BOOL    TaskbarHide(HWND Hwnd)      Taste in der Taskbar verstecken
        //      BOOL    TaskbarShow(HWND Hwnd)      Taste in der Taskbar anzeigen
        //
    
        #include    <windows.h>
        #include    <shellapi.h>
        #include    <shlwapi.h>
        #include    <shlobj.h>
        #include    <string.h>
        #include    "TaskbarTools.h"
    
        typedef struct ITaskbarListVtbl
            {
            BEGIN_INTERFACE
    
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( VOID __RPC_FAR * This,REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject);
            ULONG   ( STDMETHODCALLTYPE __RPC_FAR *AddRef         )( VOID __RPC_FAR * This);
            ULONG   ( STDMETHODCALLTYPE __RPC_FAR *Release        )( VOID __RPC_FAR * This);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *HrInit         )( VOID __RPC_FAR * This);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddTab         )( VOID __RPC_FAR * This, HWND hwnd);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *DeleteTab      )( VOID __RPC_FAR * This, HWND hwnd);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *ActivateTab    )( VOID __RPC_FAR * This, HWND hwnd);
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetActiveAlt   )( VOID __RPC_FAR * This, HWND hwnd);
    
            END_INTERFACE
            } ITaskbarListVtbl;
    
        typedef struct
            {
            ITaskbarListVtbl    *lpVtbl;
            }ITaskbarList_;
    
        static  ITaskbarList_   *list=0;
        static  int exit_add=0;
    
        //*****************************************************************************
        //*
        //*     TaskbarInit
        //*
        //*****************************************************************************
        //  Initialisiert die Taskbar Routienen
        //  Ergibt TRUE wenn erfolgreich
        BOOL TaskbarInit()
        {
        HRESULT hr;
    
            if(list)return TRUE;
    
            hr=CoInitialize( NULL );
            if(!SUCCEEDED(hr))return FALSE;
    
            hr=CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList,(void**)&list);
            if(!SUCCEEDED(hr))return FALSE;
    
        return TRUE;
        }
    
        //*****************************************************************************
        //*
        //*     TaskbarExit
        //*
        //*****************************************************************************
        //  Deinitialisiert die Taskbar Routienen
        void __cdecl TaskbarExit(void )
        {
            if(!list)return;
    
            CoUninitialize();
            list=0;
        }
    
        //*****************************************************************************
        //*
        //*     TaskbarHide
        //*
        //*****************************************************************************
        //  Versteckt die Taskleiste die zu Hwnd gehört
        //  Ergibt TRUE wenn erfolgreich
        BOOL TaskbarHide(HWND Hwnd)
        {
        HRESULT hr;
    
            if(!list)
                {
                if(!TaskbarInit())return FALSE;
                if(!exit_add){atexit(TaskbarExit);exit_add=1;}
                }
    
            hr=list->lpVtbl->DeleteTab(list,Hwnd);
            if(!SUCCEEDED(hr))return FALSE;
    
        return TRUE;
        }
    
        //*****************************************************************************
        //*
        //*     TaskbarShow
        //*
        //*****************************************************************************
        //  Erstellt eine Taste in der Taskleiste die zu Hwnd gehört
        //  Ergibt TRUE wenn erfolgreich
        BOOL TaskbarShow(HWND Hwnd)
        {
        HRESULT hr;
    
            if(!list)
                {
                if(!TaskbarInit())return FALSE;
                if(!exit_add){atexit(TaskbarExit);exit_add=1;}
                }
            hr=list->lpVtbl->AddTab(list,Hwnd);
            hr=list->lpVtbl->ActivateTab(list,Hwnd);
            if(!SUCCEEDED(hr))return FALSE;
    
        return TRUE;
        }
    

  • Mod

    Felk schrieb:

    bitte helft mir doch 😞

    Nicht so ungeduldig, ein Stündchen Zeit kann freiwilligen Helfern schon geben.

    ich will mir nämlich einfach einen vokabeltrainer machen, der mir alle 5 minuten oder so eine vokabel als baloon-tooltip einblendet.
    Doch dazu muss das Teil funktionieren und ich wollte dafür eigentlich nicht gleich C++ lernen müssen 😞

    "Aber Herr Wachtmeister, ich wollte doch einfach nur von Hamburg nach München fahren, aber einen Führerschein wollte ich dafür nicht extra machen" 🙄

    C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp In function `BOOL TaskbarInit()': 
    69 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp `CLSID_TaskbarList' undeclared (first use this function) 
      (Each undeclared identifier is reported only once for each function it appears in.) 
    69 C:\Users\Felk\Desktop\dev_cpp\proj1\main.cpp `IID_ITaskbarList' undeclared (first use this function) 
     C:\Users\Felk\Desktop\dev_cpp\proj1\Makefile.win [Build Error]  [main.o] Error 1
    

    Die müssten in der objbase.h deklariert sein.

    Das ganze hat mit C++ aber nichts mehr zu tun, das wird jetzt eher WinApi spezifisch. Ich verschiebe dich mal.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.





  • Danke für eure Hilfe 🙂
    Hab mich im Endeffekt mit NOTIFYICONDATA auseinandergesetzt. Hatte damit vorher probleme, da er szInfo und szInfoTitle nicht erkennen wollte. Habe, wie per Google gefunden, via #define _WIN32_IE 0x0600 und ähnlichem versucht es zum laufen zu bringen. Habe aber im endeffekt statt NOTIFYICONDATA eine Instanz der Ur-klasse NOTIFYICONDATAA gemacht und es geht 🙂
    Das ganze sieht jetzt so aus:

    #define _WIN32_IE 0x0600
    #include <windows.h>
    #include <iostream>
    #include <stdlib.h>
    #include "shellapi.h"
    
    void SetBaloonTip(HWND hwndDlg, const char* title, const char* text)
    {
       NOTIFYICONDATAA  NotifyIconData;
       memset(&NotifyIconData, 0, sizeof(NOTIFYICONDATA));
       NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
       NotifyIconData.uID = 123;
       NotifyIconData.hWnd = hwndDlg;
       NotifyIconData.hIcon = NULL;
       NotifyIconData.uFlags = 0x10;
       NotifyIconData.uTimeout = 10000;
       NotifyIconData.uCallbackMessage = 0;
       //strcpy(NotifyIconData.szInfoTitle, "BaloonTitle");
       //strcpy(NotifyIconData.szInfo, "BalloonInfo");
       strcpy(NotifyIconData.szInfoTitle, title);
       strcpy(NotifyIconData.szInfo, text);
       strcpy(NotifyIconData.szTip, "TrayTip");
       Shell_NotifyIcon(NIM_MODIFY, (NOTIFYICONDATA *)&NotifyIconData);
       //Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA *)&NotifyIconData);
    }
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "WindowsApp";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Windows App",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        //ShowWindow (hwnd, nFunsterStil);
    
        #define ID_TASKBARICON 100
        #define WM_ICONNOTIFY           (WM_USER + 101)
    
        //NOTIFYICONDATA nid;
        //nid.cbSize = sizeof(NOTIFYICONDATA);
        //nid.hWnd = hwnd;
        //nid.uID = ID_TASKBARICON;
        //nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
        //nid.uCallbackMessage = WM_ICONNOTIFY;
        //nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        //strcpy(nid.szTip, "Tooltip Text");
        //nid.szInfo = "Test";
        //nid.szInfoTitle = "Some text";
        //lstrcpyn(nid.szInfo, WXSTRINGCAST message, sizeof(nid.szInfo));
        //lstrcpyn(nid.szInfoTitle, WXSTRINGCAST title,
        //sizeof(nid.szInfoTitle));
    
        //Shell_NotifyIcon(NIM_ADD, &nid);
    
        //ShowWindowAsync( hwnd, SW_HIDE );
    
        NOTIFYICONDATAA  NotifyIconData;
        memset(&NotifyIconData, 0, sizeof(NOTIFYICONDATA));
        NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
        NotifyIconData.uID = 123;
        NotifyIconData.hWnd = hwnd;
        NotifyIconData.hIcon = 0;
        NotifyIconData.uFlags = 0x10;
        NotifyIconData.uTimeout = 1000;
        NotifyIconData.uCallbackMessage = 0;
        strcpy(NotifyIconData.szInfoTitle, "Start");
        strcpy(NotifyIconData.szInfo, "BalloonInfo");
        strcpy(NotifyIconData.szTip, "TrayTip");
        Shell_NotifyIcon(NIM_ADD, (NOTIFYICONDATA *)&NotifyIconData);
    
        Sleep(60000);
        //SetBaloonTip(hwnd);
        SetBaloonTip(hwnd, "t1", "t2");
        Sleep(60000);
        //SetBaloonTip(hwnd);
        SetBaloonTip(hwnd, "t3", "t4");
        Sleep(60000);
        SetBaloonTip(hwnd, "t5", "t6");
        Sleep(60000);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    Also das werde ich noch mächtig bearbeiten (die Tooltip-Inhalte aus .txt auslesen, den code versuchen zu optimieren also z.B. dass ich wie jetzt nicht alle notifyicon-eigenschaften jedesmal neu verteile, steuerelemente versuchen einzufügen)
    vielen dank für eure hilfe, ohne euch würde ich immernoch irgendwo festhängen 🙂


Anmelden zum Antworten