System Tray - Das Icon verschwindet immer...



  • Hi Leute,

    ich bin ein absoluter MFC/Win32 Noob. Zurzeit steht ein Projekt für mich in Visual .Net (C++) an. Normalerweiser prog ich aber in Java...
    Darum habe ich mal ne kurze Frage zu einem generellen Problem das ich habe:
    Ich versuche mein Fenster mit ShowWindow(WS_HIDE) beim InitDialog zu verstecken und nur ein Symbol im System Tray anzuzeigen. Hier der Code:

    ...
    
    ShowWindow(SW_HIDE);		
    // TODO: Hier zusätzliche Initialisierung einfügen
    
    someData.cbSize = sizeof(NOTIFYICONDATA);
    someData.hWnd = (HWND)GetWindow(GW_OWNER);
    someData.uID = 815;
    someData.uFlags = NIF_ICON | NIF_MESSAGE;
    someData.uCallbackMessage = WM_MOUSEMOVE;			
    someData.hIcon = m_hIcon;
    Shell_NotifyIcon(NIM_ADD, &someData);
    
    return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    

    Wenn ich jetzt versuche bei someData.uFlags das Flag NIF_STATE hinzuzufügen kommt es zu einem Kompilierfehler:
    c:\VSDEV\EPQuickDlg.cpp(109) : error C2065: 'NIF_STATE': nichtdeklarierter Bezeichner
    NIF_STATE soll aber angeblich ab Version 5 (was auch immer das bedeutet) vorhanden sein. Ich prog auf einem Win2000 Rechner mit IE 6.0... also werde ich doch Version 5.0 haben, oder? Oder muß ich da noch was in den Linker einbinden?

    Eine weiter Frage:
    Warum verschwindet das Icon im System Tray immer wenn ich mit der Maus darüber gehe?

    Ich hoffe das mir hier jemand helfen kann...



  • zur zweiten frage: wahrscheinlich wegen WM_MOUSEMOVE

    hab sowas auch mal gemacht... funzt einwandfrei... vielleicht hab ich nacher zeit es dir rauszukramen



  • Jo das wäre nett ...



  • Ich hab für den Systray mal eine Klasse geschrieben, für
    Dialogbasierte Anwendungen, Einfach als Basisklasse benutzen, fertig.
    CTray

    Devil



  • Also als uCallbackMessage hab ich immer WM_ICONNOTIFY und WM_ICONNOTIFY defiere ich so:

    #define WM_ICONNOTIFY (WM_USER+1)
    

    Klappt auf jeden fall...

    MFG

    Hansi



  • Hi Hansi,

    mein Icon verschwindet trotzdem...??
    Ach und kannst Du mir kurz erklären was diese WM_USER+1 macht?
    Bin ein echter Win32 Noob 😉
    Das Event Handling unter Java funkt irgendwie anders ...



  • Devil ich probier deine Klasse morgen früh gleich mal aus !!! THX Schonmal!



  • Also als kompletten Code habe ich in DefWindowProc in der MainFrame:

    if( message == WM_SYSCOMMAND )
    	{
    		if( wParam == SC_MINIMIZE )
    		{
    			NOTIFYICONDATA	tnid;
    
    			tnid.cbSize				= sizeof( NOTIFYICONDATA );
    			tnid.hWnd				= AfxGetMainWnd()->GetSafeHwnd();
    			tnid.uID				= 0;
    			tnid.uFlags				= NIF_MESSAGE | NIF_ICON | NIF_TIP;
    			tnid.uCallbackMessage	= WM_ICONNOTIFY;
    			tnid.hIcon				= AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    			lstrcpyn( tnid.szTip, AfxGetAppName(), sizeof(tnid.szTip) );
    
    			Shell_NotifyIcon( NIM_ADD, &tnid );
    
    			AfxGetApp()->HideApplication();
    
    			return 0;
    		}
    	}
    	else if( message == WM_ICONNOTIFY && lParam != WM_MOUSEMOVE )
    	{
    		NOTIFYICONDATA	tnid;
    
    		tnid.cbSize				= sizeof( NOTIFYICONDATA );
    		tnid.hWnd				= AfxGetMainWnd()->GetSafeHwnd();
    		tnid.uID				= 0;
    
    		Shell_NotifyIcon( NIM_DELETE, &tnid );
    
    		AfxGetMainWnd()->ShowWindow( SW_SHOW );
    		AfxGetMainWnd()->UpdateWindow();
    		AfxGetMainWnd()->SetActiveWindow();
    
    		return 0;
    	}
    

    WM_USER is irgendwie gut für eigene Messages zu Definieren, mehr weiß ich dadrüber auch net... Deshalb brauchst du vielleicht auch noch den Teil unter

    else if( message == WM_ICONNOTIFY && lParam != WM_MOUSEMOVE )
    

    MFG

    Hansi



  • Windows hat ja auch eigene Messages definiert, die sollte man möglichst nicht für eigene Messages missbrauchen. WM_USER gibt die Grenze zwischen Windows-Messages und freien Messages an.

    Gruß,
    phips!





  • hiho, danke ... sehr nützlich 🙂

    Allerdings wird das ganze nur korrekt funktioneren wenn man am Schluß die Standardeigenschaften von DefWindowProc aus der CFrameWnd lädt, sprich ...

    CFrameWnd::DefWindowProc(message, wParam, lParam);
    

    P.S.: habs ohne die vererbung probiert, hab nur fehler im fensteraufbau gehabt !


Anmelden zum Antworten