Seite 1 von 1

[gelöst] Hintergrundprogramm macht Probleme beim Abmelden

Verfasst: 31. Oktober 2005 09:42
von dani
Hallo,

ich habe einen Client geschrieben, der im Hintergrund läuft und nur bei bestimmten Ereignissen irgendwelche Fenster öffnet.

Jetzt habe ich allerdings das Problem, dass das Programm beim Herunterfahren oder beim Abmelden gewaltsam beendet werden muss. Da kommt dann dieser hässliche Beenden-Dialog.

Was muss ich tun, damit sich das Programm ganz normal beenden lässt?

Hier hab ich noch ein minimales Code-Beispiel, bei dem der Fehler auftritt: (Windows XP, Qt 4.0.1)

Code: Alles auswählen

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	//Hinweis: das QuitOnLastWindowClosed dürfte nicht für das Problem verantwortlich sein
	app.setQuitOnLastWindowClosed(false);
	QPushButton widget("Bla");
	widget.hide();
	return app.exec();
}
Ich ahne schon, dass die Lösung für das Problem sehr einfach ist, aber ich finde einfach keine Lösung. :oops:

Verfasst: 31. Oktober 2005 13:14
von BartSimpson
ich glaube da muss denn etwas Windows API code rein, das das Programm benachrichtig, das jezt die Kiste runtergefahren wird.

Verfasst: 31. Oktober 2005 13:15
von dani
Und wie muss ich das machen?

Verfasst: 31. Oktober 2005 13:31
von BartSimpson
In der Windows API stecke ich auch nicht gut drin. Aber du kannst ja mal auf den MSDN Seiten suchen.

Verfasst: 31. Oktober 2005 13:48
von dani
Ich finde einfach nichts passendes. Es kann doch nicht sein, dass ich ein so einfaches Programm nicht beenden lässt...

Verfasst: 31. Oktober 2005 15:18
von dani
Ich bin jetzt zu einer Lösung gekommen.

Code: Alles auswählen

#include <QApplication>
#include <QPushButton>

#include <windows.h>

class MyApp : public QApplication
{
	public:
	MyApp(int &argc, char ** argv)
		: QApplication(argc, argv) { };
	
	virtual bool winEventFilter(MSG* msg, long* result) {
		if(msg->message == WM_QUERYENDSESSION) {
			*result = 1;
			quit();
			return true;
		}
		return false;
	};
};

int main(int argc, char *argv[])
{
	MyApp app(argc, argv);
	app.setQuitOnLastWindowClosed(false);
	QPushButton widget("Bla");
	widget.hide();
	return app.exec();
}
Wegen dem Code innerhalb der Klasse: Ja, eigentlich macht man sowas nicht, ich weiß. ;) Aber bei den paar Zeilen...

Hoffenltich komm ich jetzt mal wieder ne Weile ohne Winapi aus. :twisted:

Verfasst: 31. Oktober 2005 17:30
von BartSimpson
und Teileweise mit dem Linken aufpassen. Und das nicht alle win32 API Aufrufe überall verfügbar sind.