Lästiges cmd-Fenster



  • Hallo!

    Ich erzeuge mit einem C-Programm unter Windows mit CreateWindowEx ein ganz normales Fenster. Leider wird beim Programmstart aber immer zusätzlich auch ein cmd-Fenster (eine DosBox) erzeugt, die ich aber nicht haben will. Wie kann ich verhindern, dass dieses schwarze Konsolenfenster erscheint?
    Das blöde dabei: Sobald ich dieses Command-Fenster schließe, wir auch mein Programm beendet.

    Kann das am Compikler liegen? Ich verwende MinGW.

    Das ist der Sourcecode des C-Programms:

    //simple Window
    //compile-Befehl: C:\MinGW\bin\gcc simple.c -lgdi32 -o simple.exe
    #include <windows.h>
    
    // Prototyp meiner Callback-Funktion
    LRESULT CALLBACK MyWndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam);
    
    // Hier beginnts:
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    	HWND hWnd;
    	MSG  msg;
    	WNDCLASSEX wc;
    	LPCSTR lpszAppName = "AppName";
    	LPCSTR lpszTitle   = "simple Window";
    
    	// Fensterklasse initialisieren
    	wc.cbSize        =  sizeof(WNDCLASSEX);						// Größe dieser Struktur
    	wc.style         =  CS_HREDRAW | CS_VREDRAW;				// Fenster neuzeichnen bei Größenänderung
    	wc.lpfnWndProc   =  MyWndProc;								// Callback-Funktion des Fensters (Default)
    	wc.cbClsExtra    =  0;										// Extra-Speicher
    	wc.cbWndExtra    =  0;										// Extra-Speicher
    	wc.hInstance     =  hInstance;								// Instanz-ID (wurde beim Aufruf des Programm vom Betriebssystem übergeben)
    	wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);				// Cursor für dieses Fenster
    	wc.hIcon         =  LoadIcon(NULL, IDI_APPLICATION);		// Icon für dieses Fenster
    	wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);	// weißer Hintergrund
    	wc.lpszClassName =  lpszAppName;							// Name der FensterKlasse
    	wc.lpszMenuName  =  lpszAppName;							// Name der FensterKlasse
    	wc.hIconSm       =  LoadIcon(NULL, IDI_APPLICATION);		// Icon (links oben in Titelzeile)
    
    	// Fensterklasse registrieren (Abbruch falls Registrierung fehlschlägt)
    	if( RegisterClassEx(&wc) == 0) return 1;
    
    	// Fenster erzeugen
    	hWnd = CreateWindowEx(	0,									// 0 = kein erweiterter Windows-Style
    							lpszAppName,						// Name der FensterKlasse
    							lpszTitle,							// Fenstertitel
    							WS_OVERLAPPEDWINDOW,				// Fenster-Style
    							CW_USEDEFAULT, CW_USEDEFAULT,		// Koordinaten der linke obere Ecke
    							CW_USEDEFAULT, CW_USEDEFAULT,		// Abmessungen des Fensters
    							NULL,								// Handle des Parent-Fensters: 0=kein Parent; (HWND_MESSAGE würde unsichtbares Fenster erzeugen)
    							NULL,								// Handle des Menüs
    							hInstance,							// Instanz zu der das Fenster gehört
    							NULL);								// Nachricht die beim Start verarbeitet werden soll
    
    	// Abbruch bei Misslingen:
    	if(hWnd == NULL) return 1;
    
    	// Fenster anzeigen
    	ShowWindow(hWnd, iCmdShow);
    
    	// Fenster aktualisieren
    	UpdateWindow(hWnd);
    
    	// Tastatur-, Maus- und andere Ereignisse verarbeiten
    	while (GetMessage(&msg, NULL, 0, 0) > 0) {
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    //===================================================================
    // Diese Funktion wird von Windows bei jeder Nachricht aufgerufen:
    //===================================================================
    LRESULT CALLBACK MyWndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam) {
    	switch (umsg) {
    		case WM_DESTROY: {			// Das Fenster wurde geschlossen
    			PostQuitMessage(0); 	// Aufforderung an das Programm sich zu beenden
    			return 0;
    		}
    	}
    	// Alle unbehandelten Events sollen von Windows behandelt werden
    	return DefWindowProc(hWnd, umsg, wParam, lParam);
    }
    

    Und mit diesem Befehl (den ich natürlich in einem cmd-Fenster absetze) habe ich das Ding compiliert:

    C:\MinGW\bin\gcc simple.c -lgdi32 -o simple.exe

    Danke für eure Hilfe!

    Liebe Grüße
    Hubert



  • Hi!
    Dein Code ist ok, das liegt an deinen Compiler-Einstellungen. Weiteres kann ich dir dazu nicht sagen, weil ich den Compiler selbst nicht kenne.

    Gruß,
    w.s.


  • Mod

    Sag Deinem Linker er soll keine Conmsolen Anwednung erzeugen sondern ein Programm mit dem SUBSYSTEM:WINDOWS



  • Danke, Problem gelöst!

    So funktionierts:

    C:\MinGW\bin\gcc simple.c -lgdi32 -mwindows -o simple.exe
    

    In einem anderen Forum (nämlich da: http://www.allegro.cc/forums/print-thread/594895)habe ich gelesen, dass -mwindows depreciated sei, und man stattdessen -Wl,-subsystem,windows verwenden soll. Wenn ich das mache bekomme ich aber eine Fehlermeldung.
    -mwindows funktioniert aber tadellos, und das genügt mir.

    Nochmals Danke!

    Liebe Grüße
    Hubert



  • Sehr gut! 👍
    Weitermachen! 🙂


Log in to reply