Programm ohne Fenster?



  • Ich bin dabei, ein Programm zu schreiben, dass einfach im Hintergrund laufen soll. Es braucht kein Fenster, keine Nachrichtenverarbeitung und nur wenig Bibliotheken. Problem: mit der normalen Funktion main bekomme ich ein Fenster eingezeigt, mit WinMain nicht. Aber den zusätzlichen Code durch WinMain kann ich mir sparen. Gibt es eine Möglichkeit, das Fenster zu unterdrücken?


  • Mod

    Was für zusäötzlicher Code in WinMain. Schreib rein was Du willst, return und gut!



  • windows.h? Oder braucht man die etwa nicht?



  • Mit der 'normalen' main-Funktion bekommst du ein Konsolenfenster (nicht gerade das, was du willst). Wenn du ein fensterloses Programm ausführen willst, würde ich schon zur WinMain-Vaiante raten. Da gibts auch kaum zusätzlichen Code, da du ja auf Spirenzchen wie eine Nachrichtenschleife verzichtest. Erstelle einfach ein neues (leeres) Projekt und führe in der WinMain aus, was du willst.



  • Der aus dem Westen ... schrieb:

    windows.h? Oder braucht man die etwa nicht?

    Wow, eine ganze Zeile mehr schreiben... 😃



  • Es liegt nicht an der Zeile selbst, sondern, was sie tut: nämlich die gesamte API einbinden, worauf ich allerdings nicht so scharf bin. Es soll ein kleines, beinahe schon nichtig-wirkendes Programm werden.



  • Wenn du WinApi benutzt, dann hast du auch eine WinMain und ein Fenster. Du kannst das Fenster natürlich auch unsichtbar machen oder einfach eine Konsolenanwendung schreiben. Wo ist dein Problem?



  • Ich will:
    - ein triviales Programm, dass im Hintergrund laufen soll
    - , dass man nicht mal bemerkt, dass es läuft
    - keine Fenstern oder Nachrichtenbehandlung
    - den Code ganz klein halten.

    Um kein Fenstern zu bekommen, will ich die Funktion WinMain aufrufen. Soweit ich weiss, ist diese in der Headerdatei <windows.h> deklariert, also müsste ich diese einbinden. Je mehr ich aber einbinde, desto grösser mein Quell- und der Maschinencode. Um Punkt 1-3 zu erfüllen, müsste ich also gegen Punkt 4 verstossen, aber das tue ich nicht. Deshalb meine Frage: Gibt es die Möglichkeit, alle meine Kriterien zu erfüllen?



  • Was für ein Programm soll das denn werden?



  • Sobald du eine Windows-Anwendung wählst, hast du zwangsläufig einen von Windows vorgegebenen Überbau. Dein Code kann dennoch klein bleiben. Die EXE kriegst du aber nicht auf die einer Konsolenanwendung reduziert. Also sage konkret, was du vorhast! Irgendwer wird dir schon helfen können. Oder anders gesagt: "Let it be!"



  • Also ... ich habe mal folgende "Programme" getestet:
    1. Konsole (mit Fenster)

    int main()
    {
    
    	int i;
    	i = 5;
    	return;	
    }
    

    und 2. Windows (ohne Fenster)

    #include <windows.h>
    
    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR cmdLine, int show)
    {
    
    	int i;
    	i = 5;
    	return;	
    }
    

    Ersteres hat 49 Byte Quellcode, 5632 Byte exe-Datei, letzteres hat 141 Byte Quellcode, 6144 Byte exe-Datei, das sollte den Bock doch nicht fett machen?!


  • Mod

    Der Unterschied in der Größe liegt im unterschiedlichen Startup, den die CRT benötigt.

    Was interessiert Dich denn diese 6kb, wenn allene Dein Stack schon 1MB frisst?



  • also ich schnalls nicht .... vermutlich bin ich auch noch zu neu für die materie.
    aber ich würde auch gerne mein fenster unterdrücken und zwar ganz ohne task oder tray-symbol.
    wenn ich den oben geposteten code nutze, bekomme ich fehler ohne plan warum:

    #include <windows.h>
    
    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR cmdLine, int show)
    {
    
        int i;
        i = 5;
        return 0;   
    }
    

    kann mir mal jemand sagen warum ? ich habe VC++2008 mit SP1

    danke!



  • Du musst schon dabei schreiben welche Fehler das sind 😉



  • [code]1>------ Erstellen gestartet: Projekt: shellunterdrücken3, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>main.cpp
    1>c:\users\docmann\documents\visual studio 2008\projects\shellunterdrücken3\shellunterdrücken3\main.cpp(4) : error C2731: 'WinMain': Überladen der Funktion nicht möglich
    1>        c:\users\docmann\documents\visual studio 2008\projects\shellunterdrücken3\shellunterdrücken3\main.cpp(3): Siehe Deklaration von 'WinMain'
    1>Das Buildprotokoll wurde unter "file://c:\Users\docmann\Documents\Visual Studio 2008\Projects\shellunterdrücken3\shellunterdrücken3\Debug\BuildLog.htm" gespeichert.
    1>shellunterdrücken3 - 1 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    ich hab schon einiges versucht aber irgendwie scheint es ja an der API zu liegen und da hab ich nicht wirklich viel plan...



  • Du hast bestimmt ein "Win32 Project" in Visual Studio erzeugt, sämtlichen vorgegeben Quelltext weggelöscht und dann Copy+Paste gemacht? 😉

    Erzeugt man in Visual Studio ein "Win32 Project" heisst die WinMain dort nämlich anders (bzw. es gibt bereits eine WinMain, welche aber dann _tWinMain aufruft):

    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    


  • Bei Code::Blocks kann man in Target options "Type" jederzeit zu GUI application ändern, dann wird kein Fenster erzeugt und du kannst trotzdem main() benutzen.
    Sicherlich gibt's was ähnliches auch bei VC++.



  • geeky schrieb:

    Du hast bestimmt ein "Win32 Project" in Visual Studio erzeugt, sämtlichen vorgegeben Quelltext weggelöscht und dann Copy+Paste gemacht? 😉

    Erzeugt man in Visual Studio ein "Win32 Project" heisst die WinMain dort nämlich anders (bzw. es gibt bereits eine WinMain, welche aber dann _tWinMain aufruft):

    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    

    nein, eigentlich hab ich mein project als konsolenanwendung erzeugt.
    mein wunsch das fenster zu unterdrücken bzw gar nicht zu erzeugen bezieht sich auf eine windows konsolenanwendung. falls es im syntax einen unterschied zum win32 project gibt, bin auch gerne offen für beide wege 🙂



  • Athar schrieb:

    Bei Code::Blocks kann man in Target options "Type" jederzeit zu GUI application ändern, dann wird kein Fenster erzeugt und du kannst trotzdem main() benutzen.
    Sicherlich gibt's was ähnliches auch bei VC++.

    aha, du scheinst davon ausgegangen zu sein, das ich eine konsolenanwendung erzeugen wollte, richtig ? 😃

    wobei ich keine ahnung habe wo ich "Code::Blocks" finde?

    EDIT: ich hab jetzt was hinbekommen was mir noch nciht so ganz gefällt:

    ShowWindow(FindWindowA("ConsoleWindowClass",NULL),0);
    

    leider poppt das fenster immernoch für ne knappe skunde auf 😞



  • Erzeuge einfach ein "Win32 Project" lösch alles aus der _tWinMain()-Funktion, die er dir beim "Win32 Project" erzeugt, raus und mach dann in der _TWinMain() halt deinen Krempel 😉

    (Man kann zwar eine Konsolenawendung auch switchen, aber ich weiss nicht auswendig wo welche Einstellungen das sind...)

    btw:
    Mit ShowWindow() das Konsolenfenster ausblenden ist meiner Meinung nach Fusch...


Anmelden zum Antworten