programm bei start direkt in system tray



  • Hallo zusammen,
    habe da ein kleines Problem:
    Ich habe ein dialog basiertes ChatProgramm geschrieben und hätte jetzte gerne, daß es beim Start direkt im System Tray erscheint und nicht erst auf dem Desktop aufgeht.
    Dazu habe ich eine Funtkion "Icon()" geschrieben, die im InitDialog() aufgerufen wird und eben dies gewährleisten soll. Leider klappt das nicht so ganz und der Dialog erscheint trotzdem erst mal geöffnet. Wenn ich die ganze Sache debugge springt das Programm zwar in die Funktion aber passieren tut nix.
    Erst wenn ich im Dialog einen Button klicke, der ebenfalls mit eben dieser Funktion hinterlegt ist verschwindet der Dialog im Tray.
    Kann mir jemand sagen was da schief läuft?
    Anbei die Funktion:

    void CMessengerDlg::Icon()
    {
        char    toolTip[64];
    
        NOTIFYICONDATA tnd;
        ShowWindow(SW_HIDE);
        ZeroMemory(&tnd, sizeof (NOTIFYICONDATA)); 
        tnd.cbSize = sizeof (NOTIFYICONDATA);
        tnd.hWnd = this ->m_hWnd;
        tnd.uID = 1;
        tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
        tnd.uCallbackMessage = m_WMChatMessage;
        tnd.hIcon = (HICON) LoadImage(AfxGetApp()->m_hInstance,
        MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,
        32,32,LR_SHARED|LR_DEFAULTCOLOR);
        tnd.szTip[*toolTip];
        lstrcpyn(tnd.szTip,"Nachrichtensystem",sizeof(tnd.szTip));
        Shell_NotifyIcon(NIM_ADD,&tnd);
    
    }
    

    Aufruf aus InitDialog():

    ...
    ...
    ...
    [cpp]SetIcon(m_hIcon, TRUE); // Großes Symbolverwenden
    SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden
    // TODO: Hier zusätzliche Initialisierung einfügen
    short number = GetNumberOfHostIpAddresses();
    sOwnIP = GetHostIPAddressString(1);
    m_connect.SetParent(this);
    m_connect.StartListen();
    m_strListe = "";
    m_Handle = 0; //Timer-Handle
    m_rPriority = "3"; //Nachrichtenpriorität
    OnBnClickedConnect();
    Icon();

    return TRUE;[/cpp]



  • OnInitDialog() wird ausgeführt, kurz bevor das Fenster erstellt wird. Vielleicht liegt es daran, dass es nicht klappt. Es ist einfach noch kein Fenster da, das minimiert werden kann.

    Schreib den Aufruf an das Ende von OnPaint(). Dann verschwindet es nach einem ganz kurzen Aufflackern. [edit] Allerdings bekommst du es dann nie zu Gesicht... [/edit]

    Vielleicht wäre das hier ja auch noch hilfreich:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39094&highlight=unsichtbar
    http://www.c-plusplus.net/forum/viewtopic.php?t=39045&highlight=unsichtbar



  • das mit OnPaint() ist zwar ganz nett aber irgendwann will ich ja schon mal mit meinem Programm arbeiten 😉
    Die anderen zwei Postings haben mich auch nicht wirklich weiter gebracht...
    Trotzdem danke für die Mühe 👍



  • Nur so nebenbei:
    was ist denn eigentlich m_WMChatMessage und was steht da drin ? Ist die einzige Variable, die bei mit unbekannt ist, wenn ich deinen Code kopiere und bei mir einfüge.

    Und gleich noch eine Frage:
    wie maximierst du dein Programm wieder ? Mein Testprojekt mit deinem Code minimiert das Programm zwar, aber weder mit der rechten noch mit der linken Maustaste bekomme ich es wieder in den Vordergrund...



  • mWMChatMessage:

    const UINT   m_WMChatMessage = RegisterWindowMessage("WM_NOTIFYICON");
    

    maximieren:

    LRESULT CMessengerDlg::OnShowDlg(WPARAM wParam, LPARAM lParam)
    {
    	if (lParam == WM_LBUTTONDOWN)
    	{
    		ShowWindow(SW_SHOW);
    		    NOTIFYICONDATA    tnd;        
    			tnd.cbSize = sizeof(NOTIFYICONDATA);    
    			tnd.hWnd = this ->m_hWnd;  
    			tnd.uID = 1;  
    			tnd.uFlags = NIF_MESSAGE|NIF_ICON; 
    			tnd.uCallbackMessage= m_WMChatMessage;   
    			tnd.hIcon = 0; 
    			tnd.szTip[0] = '\0';     
    		    Shell_NotifyIcon(NIM_DELETE,&tnd);
    			return 1;
    	}
    
    	return 0;
    }
    


  • Yo, danke für die Auskunft.

    Fällt mir gerade noch ein:
    vielleicht auch nicht so toll, könnte aber klappen:
    - eine Membervariable erstellen (z.B. bool bErsterAufruf;)
    - in OnInitDialog den Wert setzen: bErsterAufruf = true;
    - in OnPait Wert abfragen und ändern:

    if(bErsterAufruf)
    {
        bErsterAufruf = false;
        Icon();
    }
    


  • funzt leider auch nicht...hatte schon hoffnung geschöpft.
    naja, trotzdem danke...vielleicht fällt mir ja heute nacht im traum noch was dazu ein 😃



  • hm, also, du könntest natürlich in der App Klasse das DoModal unterbinden, und
    erst starten, wenn dort geklickt wird.

    Devil



  • davon hab ich mittlerweile auch schon in diversen newsgroups gelesen...
    allerdings ist mir noch nicht so ganz klar, wie das von statten geht.
    vielleicht kannst du mir ja noch ein paar infos dazu geben...wäre dir sehr dankbar



  • Hm, du könntest die DoModal überschreiben.

    dann noch ne Variable, ob die anwendung gerade startet oder nicht.

    In der Routine wo du den Doppelklick auf den Tray behandelst, musst
    du dann das abfragen. Wenn ja -> Basisklasse::DoModal().
    Wenn nein, einfach wiederherstellen.

    hm, hört sich gut an, aber ist nicht umsetzbar. *g*
    In der Initinstance müsstest du es irgendwie so machen, anders gehts nicht,
    da DoModal ja ansonsten ne Endlosschhleife oder sowas bräuchte.

    Devil



  • also bei mir ist die luft für heute eh raus...schlaf nochmal ne nacht drüber.
    wenn irgend jemand noch ne idee hat isser herzlich eingeladen sich hier auszulassen. ansonsten schönen tag noch...



  • Ich hatte das Problem auch.

    Ich habe es mit einem Timer gelöst, der in OnInitDialog angeworfen wird und in der OnTimer Funktion wieder gelöscht.
    Wenn du den Zeitraum ziemlich kurz setzt, kriegst du das Fenster nur ganz selten zu sehen. Ich habe das Programm im Autostart und wenn so 15 Programme gleichzeitig starten, ist der Rechner schon arg langsam - dann sehe ich den Dialog manchmal (zu 5%) für eine knappe Sekunde. Sonst nie.



  • coole sache das mit dem timer.
    hab´s jetzt auch so gemacht. ist glaub ich noch mit die einfachste lösung.
    danke für den tip @estartu_de
    allen anderen natürlich auch danke für eure vorschläge.

    Grüße,
    zippo


Anmelden zum Antworten