C++ Programm im Hintergrund

Guybrush

Cadet 4th Year
Registriert
Juni 2004
Beiträge
96
Ich bin zwar noch ziemlicher Neuling auf dem C++-Gebiet, habe aber ein recht nützliches Programm geschrieben. Ich möchte, dass das Programm im Hintergrund läuft wenn man es startet(am besten mit Symbol in der Leiste ganz unten rechts zum öffnen) und dass man die maximale Rechenleistung limitieren kann.
 
hI,

Du kannst ja aus deinem programm ein kleiner win32 - service machen und ein kleines client, welcher auf den service zugreift. der client ist als icon dann als notification sichtbar.

gruss

corey
 
1.) Wie mache ich einen Win32 service?
2.) Wie mache ich einen Klienten?

Danke erstmal für die Antwort, aber irgendwie verstehe ich nur Bahnhof.
 
Hallo Guybrush,

der Trick besteht einfach darin, bei Programmstart kein Programmfenster anzuzeigen.
Stattdessen registriert sich Dein Programm im Traybereich der Taskleiste.

Mal als Starthilfe ein bisschen Code :-).

Ein Service ist nicht unbedingt nötig.
Das brauchst Du nur wenn Dein Programm auch laufen soll ohne das sich jemand am Rechner angemeldet hat.

Das die Rechenleistung nicht zu sehr beansprucht wird, liegt an Deiner Programmiertechnik. Da hilft Dir kein Tool. Regelmassige sleeps oder besser waits wirken da Wunder.

Ansonsten kann ich dir nur die MSDN Webseite von Microsoft empfehlen, oder eben die Onlinehilfe des VC++. Da ist alles beschrieben.

Code:
void CMainFrame::addIconToTray()
{
	BOOL           lRet = FALSE;
	NOTIFYICONDATA lIcon;

	ZeroMemory( &lIcon, sizeof lIcon );
	lIcon.cbSize = sizeof NOTIFYICONDATA;
	lIcon.hIcon  = m_hIcon;
	lIcon.uFlags = NIF_ICON;
	lIcon.hWnd   = m_hWnd;
	lIcon.uID    = (UINT) this;

	if( Shell_NotifyIcon(NIM_ADD,&lIcon) )
	{
		lIcon.uVersion = NOTIFYICON_VERSION;
		lRet = Shell_NotifyIcon(NIM_SETVERSION,&lIcon);

		lIcon.uFlags = NIF_TIP;
		StringCchCopy(lIcon.szTip, ARRAYSIZE(lIcon.szTip), mpBallonTitle);
		lRet = Shell_NotifyIcon(NIM_MODIFY, &lIcon);

		lIcon.uFlags = NIF_MESSAGE;
		m_hCallbackMsg = RegisterWindowMessage(mpBallonTitle);
		lIcon.uCallbackMessage = (UINT) m_hCallbackMsg;
		lRet = Shell_NotifyIcon(NIM_MODIFY, &lIcon);
	}
}

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if( message == m_hCallbackMsg )
	{
		switch( lParam )
		{
			case WM_LBUTTONDBLCLK:
				PostMessage(WM_COMMAND,MAKELONG(IDM_KOMBI_PROP,0),0);
			return 0;
...


ON_COMMAND(IDM_KOMBI_PROP, OnKombiProp)


void CMainFrame::OnKombiProp()
{
    ShowWindow( SW_SHOW );
}

MfG

Arnd
 
Zuletzt bearbeitet:
Erstmal danke für das Material, aber als blutiger Anfänger muss ich fragen, wie man diesen Code Korrekt in sein Programm einbaut:rolleyes:
 
Hallo Guybrush,

das sind Methoden die so direkt in Dein VC++ Programm reinpassen. Die einzige Ausnahme ist die Windowproc da ist nur der Anfang gezeigt.

Das Du sie an den passenden Stellen aufrufen musst, bzw. das ON_COMMAND Macro an die passende Stelle setzen musst, da solltest Du dich mal mit dem Code den der AppWizard generiert etwas intensiver auseinandersetzen. Und auch die Online Hilfe im VC++ durchstöbern.

Ich nehme stark an das Dein Grundgerüst damit erzeugt ist?
Ein einfaches Patternmatching was wohin gehört ist, ist doch machbar?

Das addIconToTray ruft man zum Beispiel im OnCreate der Klasse CMainFrame auf.

Die benutzten Variablen musst Du noch deklarieren und auch mit Inhalt füllen.
Wenn Du ein bisschen damit spielst sollte das alles aber kein Problem sein.

Als wesentlichen Punkt solltest Du Dich mal mit der MFC auseinadersetzen, was ein CWnd ist, wie die Klassen zusammenspielen und wie die Nachrichten verabeitet werden.

Lies Dir auch mal die Beschreibung der benutzten Win32 API Funktionen durch. Dann sollte alles etwas klarer werden.

MfG

Arnd
 
Zuletzt bearbeitet:
Zurück
Oben