Ein nicht sichtbares C++ Programm erstellen (ohne (Konsolen)Fenster)



  • Eine Frage Ich möchte gerne eine c++ Anwendung ohne sichtbares Fenster erstellen, sodass sie im Hintergrund läuft (im Taskmanager unter Hintergrundprozesse). Wie genau kann ich das machen? Ich habe schon bei anderen Foren und Fragen geguckt aber habe es nicht hinbekommen (btw. bin neu bei c++)



  • Falls du dich auf Windows beziehst, so gibt es dort das Konzept eines "Subsystem", das Teil des PE-Headers ist (PE = Portable Executable, das Dateiformat der unter Windows verwendeten .exe-Dateien). Dieses Subsystem bestimmt, ob bei der Ausführung ein Konsolenfenster geöffnet wird und welchen Einstiegspunkt das Programm hat (main()-Funktion oder WinMain()-Funktion).

    Das Subsystem wird beim MSVC-Compiler/Linker über das Linker-Flag -subsystem: vorgegeben:

    -subsystem:console erzeugt ein Konsolenprogramm und erwartet main() als Einstiegspunkt/Hauptfunktion.
    -subsystem:windows erzeugt ein Windows-Programm ohne Konsolenfenster und erwartet WinMain() als Einstiegspunkt/Hauptfunktion.

    Unter Visual Studio kannst du für ein Windows-Programm ohne Konsolenfenster das Projekt entweder direkt als "Windows Dekstop Application" neu anlegen, oder unter den Projekteigenschaften unter Linker->System->SubSystem "Windows (/SUBSYSTEM:WINDOWS) auswählen.

    In GCC/Clang sind das die Compiler-Flags -mwindows und -mconsole, die dann an den Linker weitergereicht werden.

    Für das "Windows"-Subsystem benötigst du keine main()-Funktion sondern stattdessen eine WinMain() mit folgender Signatur (siehe https://docs.microsoft.com/en-us/windows/win32/learnwin32/winmain--the-application-entry-point:

    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
    {
        return 0;
    }
    

    Für die Typdefinitionen von HINSTANCE, etc solltest du dafür auch noch via #include <Windows.h> die Windows-Header einbinden:

    #ifndef NOMINMAX
        #define NOMINMAX
    #endif
    #ifndef WIN32_LEAN_AND_MEAN
        #define WIN32_LEAN_AND_MEAN
    #endif 
    #include <Windows.h>
    

    Die NOMINMAX und WIN32_LEAN_AND_MEAN-Definitionen sorgen dabei dafür, dass der Windows-Header nicht übermässig viel wahrscheinlich nicht benötigtes Zeug einbindet und keine hirnverbrannten Makros definiert wie min und max, die mit C++ zu lustigen Fehlermeldungen führen können, wenn man z.B. std::min() oder sowas verwenden will.



  • @Finnegan da ich neu bin hab ich davon ehrlich gesagt relativ wenig verstanden. Könntest du nochmal in einfach formulierten Schritten beschreiben, was ich in Visual Studio machen müsste? Wäre sehr nett, danke im Vorraus



  • @Finnegan sagte in Ein nicht sichtbares C++ Programm erstellen (ohne (Konsolen)Fenster):

    Unter Visual Studio kannst du für ein Windows-Programm ohne Konsolenfenster das Projekt entweder direkt als "Windows Dekstop Application" neu anlegen, oder unter den Projekteigenschaften unter Linker->System->SubSystem "Windows (/SUBSYSTEM:WINDOWS) auswählen.

    Bzw. "Windows-Desktopanwendung" oder wie das heisst.

    main.cpp:

    #ifndef NOMINMAX
        #define NOMINMAX
    #endif
    #ifndef WIN32_LEAN_AND_MEAN
        #define WIN32_LEAN_AND_MEAN
    #endif 
    #include <Windows.h>
    
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
    {
        return 0;
    }
    


  • @Finnegan vielen dank für deine Zeit es funktioniert. Ich hätte noch eine Frage und zwar ob ich trotzdem noch std::cout<<"...."; oder so nutzen kann. Wenn ja könntest du mir das zeigen bitte wäre total nett.



  • Da Du keine Konsole mehr hast:
    Wohin soll denn Dein cout schreiben?
    Und was genau ist 'oder so'?



  • @thinki sagte in Ein nicht sichtbares C++ Programm erstellen (ohne (Konsolen)Fenster):

    @Finnegan vielen dank für deine Zeit es funktioniert. Ich hätte noch eine Frage und zwar ob ich trotzdem noch std::cout<<"...."; oder so nutzen kann. Wenn ja könntest du mir das zeigen bitte wäre total nett.

    Keine Ahnung. Als Lehrer würd ich jetzt sagen:

    Hausaufgabe:

    Finde heraus ob und wohin bei -subsystem:windows Aufrufe von std::cout.operator<<() geschrieben werden und ob man die irgendwie abfangen kann - z.B. um sie in eine Datei zu schreiben oder um eine eigenes Konsolenfenster zu implementieren.

    Ich glaube nicht, dass man dazu irgendein Forum befragen müsste, solche Information ist frei zugänglich, wenn man weiss wie man sie Information findet.



  • Als "Hintergrundprozesse" für Windows werden eigentlich eher Dienste oder auch Tray-Anwendungen verstanden.
    Je nach UI-Framework gibt es schon Komponenten für Tray-Anwendungen. Direkt für WinAPI heißt diese "NotifyIcon", s.z.B. Creating a System Tray Icon using Visual C++ and win32.



  • @Finnegan ich hab schon eine Lösung gefunden: Ich schreib einfach alles was ich wissen will in eine txt und gucke sie mir danach an


Log in to reply