HELP TRAY ICON



  • Hy,
    Ich erstelle ein TrayIcon (das geht), aber wenn ich mit der Mouse drüber gehe verschwindet es.
    Die Frage WARUM??????? 😕
    Mein Code:

    #include "windows.h"
    
    #define WM_NOTIFICATION (WM_USER + 1)
    NOTIFYICONDATA nidTrayIcon;
    
    void tryic()
    {
        char szTip[64] = "Tray-Icon"; 
    
        nidTrayIcon.cbSize = sizeof(nidTrayIcon);
        nidTrayIcon.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        nidTrayIcon.hWnd = hWnd;
        nidTrayIcon.uCallbackMessage = (WM_USER + 1);
        nidTrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
        nidTrayIcon.uID = 0x0200;
    
        strcpy(nidTrayIcon.szTip, szTip);
        nidTrayIcon.szTip[strlen(szTip)] = '\0';
    
        Shell_NotifyIcon(NIM_ADD, &nidTrayIcon);
    
    }
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    HINSTANCE hInstGlobal;
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nCmdShow)
    
    {
        hInstGlobal = hInstance;
    
        WNDCLASS WndClass;
        WndClass.style = 0;
        WndClass.cbClsExtra = 0;
        WndClass.cbWndExtra = 0;
        WndClass.lpfnWndProc = WndProc;
        WndClass.hInstance = hInstance;
        WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW-5);
        WndClass.hCursor = LoadCursor (NULL, IDC_CROSS);
        WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        WndClass.lpszMenuName = 0;
        WndClass.lpszClassName = "Helper von Rene Schneider";
    
        RegisterClass(&WndClass);
    
        HWND hWindow;
        hWindow = CreateWindow("Helper von Rene Schneider",NULL,
                                WS_OVERLAPPEDWINDOW,
                                200,200,640,480,NULL,NULL,
                                hInstance, NULL);
    
        ShowWindow (hWindow, nCmdShow);
    
        UpdateWindow (hWindow);
    
        MSG Message;
        while (GetMessage(&Message, NULL,0,0))
        {
            DispatchMessage(&Message);
        }
    
        return (Message.wParam);
    }
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage,
                              WPARAM wParam, LPARAM lParam)
    
    {
    
       switch(uiMessage)
       {
    
       case (WM_USER + 1):
          {
             switch(lParam)
             {
                 case WM_LBUTTONUP:
                 {
    
                 }
    
             case WM_RBUTTONUP:
                {
                    Shell_NotifyIcon(NIM_DELETE, &nidTrayIcon);
    
                }
    
             }
    
             return 0;
    
    HWND hWindow;
    
    case WM_LBUTTONDOWN:
        tryic();
        return 0;
    
    case WM_RBUTTONDOWN:
    
            return 0;
    
    case WM_CREATE:
    
    return 0;
    
    //////////////////////////////          ON COMMAND
    
    case WM_COMMAND:
    
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        default:
            return DefWindowProc (hWnd, uiMessage,
                                    wParam, lParam);
        }
    }
    
    }
    

    Danke

    [ Dieser Beitrag wurde am 09.07.2002 um 14:58 Uhr von ReneS editiert. ]



  • case WM_COMMAND:
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    

    😕 😕 😕
    Das ist doch hoffentlich nur ein Tippfehler, dass nach WM_COMMAND kein break oder return steht ?!?



  • Nein ein return 0; ist da ich hatte das beim kopieren nur vergessen.



  • Ich denke, das liegt daran, dass du es bei deinem WM_USER+1 Ereignis nicht neuzeichnest und es deshalb verschwindet. Ist nur eine Vermutung, aber ICQ2002a löscht das Icon nicht aus dem Tray beim Beenden, es verschwindet erst wenn ich mit der Maus darüberfahre. Deshalb denke ich, dass du es immer wieder neu zeichnen musst.



  • Nope. Meine Idee ist nicht richtig. Ich habe es gerade selber versucht und meine Tray Icon verschwindet auch. Und wenn ich drüberfahre wird noch nicht mal eine Message gesendet.



  • Hi,

    ich hab hier ein kleines Beispiel, vielleicht hilft es euch irgendwie weiter. 😕 :p

    #include <windows.h>
    #include <stdlib.h>
    #include <tchar.h>
    
    /////////////////////////////////////////////////////
    // Constants
    /////////////////////////////////////////////////////
    
    #define WM_TRAYICON (WM_USER + 1000)
    #define ID_TRAYICON 1
    
    #define ID_MENU_SHOWMAINWINDOW 1000
    #define ID_MENU_EXIT 1001
    
    /////////////////////////////////////////////////////
    // Prototypes
    /////////////////////////////////////////////////////
    
    LRESULT CALLBACK MainWindowProcedure(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam);
    BOOL AddTrayIcon(HWND hWindow, UINT nIconIdentifier, UINT nCallbackMessage, HICON hIcon, UINT nFlags, LPTSTR lpszTip);
    BOOL RemoveTrayIcon(HWND hWindow, UINT nIconIdentifier);
    
    /////////////////////////////////////////////////////
    // Application's entry point
    /////////////////////////////////////////////////////
    
    INT WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreviousInstance, LPTSTR lpszCommandLine, INT nShowState) {
    
        /////////////////////////////////////////////////////
        // Variables
        /////////////////////////////////////////////////////
    
        WNDCLASSEX MainWindowClass = {0};
        HWND hMainWindow = NULL;
        MSG Message = {0};
    
        /////////////////////////////////////////////////////
        // Register main window class
        /////////////////////////////////////////////////////
    
        MainWindowClass.cbSize = sizeof(WNDCLASSEX);
        MainWindowClass.hInstance = hInstance;
        MainWindowClass.lpszClassName = TEXT("MainWindow");
        MainWindowClass.lpfnWndProc = MainWindowProcedure;
        MainWindowClass.style = 0;
        MainWindowClass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
        MainWindowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        MainWindowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
        MainWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
        MainWindowClass.lpszMenuName = NULL;
        MainWindowClass.cbClsExtra = 0;
        MainWindowClass.cbWndExtra = 0;
    
        if(RegisterClassEx(&MainWindowClass) == FALSE) {
            MessageBox(NULL, TEXT("Can't register MainWindowClass!"), TEXT("Information"), MB_OK);      
            return EXIT_FAILURE;
        }
    
        /////////////////////////////////////////////////////
        // Create main window
        /////////////////////////////////////////////////////
    
        hMainWindow = CreateWindowEx(0, TEXT("MainWindow"), TEXT("Simple Window Application"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, GetModuleHandle(NULL), NULL);
    
        if(hMainWindow == NULL) {
            MessageBox(NULL, TEXT("Can't create main window!"), TEXT("Information"), MB_OK);
            return EXIT_FAILURE;
        }
    
        /////////////////////////////////////////////////////
        // Message loop
        /////////////////////////////////////////////////////
    
        while(GetMessage(&Message, NULL, 0, 0)) {
            if(IsDialogMessage(hMainWindow, &Message) == FALSE) {
                TranslateMessage(&Message);
                DispatchMessage(&Message);
            }
        }
        return Message.wParam;
    }
    
    /////////////////////////////////////////////////////
    // Callback function for the main window
    /////////////////////////////////////////////////////
    
    LRESULT CALLBACK MainWindowProcedure(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam) {
        switch(uMessage) {
        case WM_SIZE:
            switch(wParam) {
            case SIZE_MINIMIZED:
                ShowWindow(hWindow, SW_HIDE);
                AddTrayIcon(hWindow, ID_TRAYICON, WM_TRAYICON, LoadIcon(NULL, IDI_INFORMATION), NIF_ICON | NIF_TIP | NIF_MESSAGE, TEXT("Tray Icon"));
                break;
            }
            break;
            case WM_COMMAND:
                switch(LOWORD(wParam)) {
                case ID_MENU_SHOWMAINWINDOW:
                    RemoveTrayIcon(hWindow, ID_TRAYICON);
                    ShowWindow(hWindow, SW_SHOWNORMAL);
                    break;
                case ID_MENU_EXIT:
                    SendMessage(hWindow, WM_DESTROY, 0, 0);
                    break;
                }
                break;
                case WM_TRAYICON:
                    switch(lParam) {
                    case WM_LBUTTONDOWN:
                        RemoveTrayIcon(hWindow, ID_TRAYICON);
                        ShowWindow(hWindow, SW_SHOWNORMAL);
                        SetForegroundWindow(hWindow);
                        break;
                    case WM_RBUTTONDOWN:
                        {
                            POINT CursorPosition = {0};
                            GetCursorPos(&CursorPosition);
    
                            SetForegroundWindow(hWindow);
    
                            HMENU hPopupMenu = CreatePopupMenu();
                            AppendMenu(hPopupMenu, MF_STRING, ID_MENU_SHOWMAINWINDOW, TEXT("&Show main window"));
                            AppendMenu(hPopupMenu, MF_STRING, ID_MENU_EXIT, TEXT("E&xit"));
                            TrackPopupMenu(hPopupMenu, TPM_RIGHTBUTTON, CursorPosition.x, CursorPosition.y, 0, hWindow, NULL);
    
                            PostMessage(hWindow, WM_NULL, 0, 0);
                            break;
                        }
                        break;
                    }
                    break;
            case WM_DESTROY:
                RemoveTrayIcon(hWindow, ID_TRAYICON);
                PostQuitMessage(EXIT_SUCCESS);
                break;
            default:
                return DefWindowProc(hWindow, uMessage, wParam, lParam);
        }
        return 0;
    }
    
    BOOL AddTrayIcon(HWND hWindow, UINT nIconIdentifier, UINT nCallbackMessage, HICON hIcon, UINT nFlags, LPTSTR lpszTip) {
        NOTIFYICONDATA NotifyIconData = {0};
        NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
        NotifyIconData.hWnd = hWindow;
        NotifyIconData.uID = nIconIdentifier;
        NotifyIconData.uCallbackMessage = nCallbackMessage;
        NotifyIconData.hIcon = hIcon;
        lstrcpy(NotifyIconData.szTip, lpszTip);
        NotifyIconData.uFlags = nFlags;
        return Shell_NotifyIcon(NIM_ADD, &NotifyIconData);
    }
    
    BOOL RemoveTrayIcon(HWND hWindow, UINT nIconIdentifier) {
        NOTIFYICONDATA NotifyIconData = {0};
        NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
        NotifyIconData.hWnd = hWindow;
        NotifyIconData.uID = nIconIdentifier;
        return Shell_NotifyIcon(NIM_DELETE, &NotifyIconData);
    }
    


  • @ReneS

    hast du nicht das TranslateMessage (...) in deiner Loop vergessen? 😉



  • Ich weiß zwar nicht, ob das jetzt die Lösung des Problemes ist, aber ich habe es so gelöst, dass ich das Icon nicht im Message Processor initialisiert habe sondern in der WinMain. Vielleicht sind die Events einfach zu kurz lebig für längere Initialisierungen und Win löscht darin gesetzt Daten wieder, wenn es abgehandelt wurde. Ist nur eine Vermutung und ich steh auch erst am Anfang meiner Karriere als Win-Prog-Guru 😃 , aber das kann doch eventuell schon mal ein Tipp sein.

    MfG
    Michael Beuse



  • Vielleicht sind die Events einfach zu kurz lebig für längere Initialisierungen und Win löscht darin gesetzt Daten wieder

    😕 😕 😕

    Was soll das denn heissen? Ist nur dummes Geschwafel von dir, oder meintest du das tatsächlich ernst?



  • Jetzt macht doch den Armen jung nich so runter!



  • Nein, das habe ich ernst gemeint. Ich bin noch nicht so bewandert in der WinAPI. Ich kann dir auch nicht sagen, wie Windows den Speicher verwaltet und auch nicht, ob das irgendwas mit dem Problem zu tun. Ich kann dir nur sagen, dass es so bei mir funktioniert hat und das ich darauf meine Vermutung begründet habe, aber das habe ich in meiner Antwort doch wohl klar gemacht.
    Ich bin immer bereit mich eines Besseren belehren zu lassen.

    MfG
    Michael Beuse

    [ Dieser Beitrag wurde am 28.11.2002 um 16:00 Uhr von BadBeu editiert. ]



  • @ReneS

    ich glaube nicht, dass der compiler bei deinem Code nichts sagt. In der Funktion tryic () benutzt du hWnd. Woher soll er das nehmen? Es müsste funzen, wenn du das Fensterhandle aus der WndProc übergibst.

    Und noch eine Frage: Warum steht das 'HWND hWindow;' über 'case WM_LBUTTONDOWN'?
    Das wird doch gar nicht gebraucht.


Anmelden zum Antworten