Kein Konsolenfenster zeichnen



  • Hallo Leute. Ich möchte gerne das CMD Fenster verstecken. Wenn man ja den Code hier benutzt...

    [cpp]
    HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
    ShowWindow(hwnd,SW_HIDE);
    [cpp]

    ... dann blinkt das Fenster ja bei jedem Start immer noch mal kurz auch. Gibt es einen Code der das Konsolenfenster erst gar nicht zeichnet sondern nur die Befehle ausführt denn mich nervt das immer wenn beim start 5 Fenster immer wieder nur kurz aufblinken.

    Mit freundlichen Grüßen

    Tim



  • So ist vielleicht besser 😃

    HWND hwnd = FindWindow("ConsoleWindowClass",NULL); 
    ShowWindow(hwnd,SW_HIDE);
    


  • mach doch gleich ein windowsprogramm ohne fenster. dann blitz auch nix.
    🙂



  • Oder ein Fensterprogramm ohne Windows ?



  • Jo danke schon mal aber wie mache ich denn ein Windowsprogramm ohne Fenster? 🙂



  • du rufst ShowWindow mit SW_HIDE auf. Dann kannst du das Programm entweder sich selbst beenden lassen, im Taskmanager killen, oder du setzt nen Systemweiten shrotcut dafür.
    grüße,
    m.v.g.



  • OK. Kannst du mir vielleicht ein Beispiel geben. Ich kenne mich in diesen Sachen nämlich noch nicht so gut aus 😃

    Mit freundlichen Grüßen

    Tim



  • Ok, ich bin auch nicht so der Windowsprogrammierer aber das krieg ich noch hin. Das Windows-Grundgerüst habe ich von hier http://zetcode.com/tutorials/winapi/window/
    weiter unten auf der Seite findest den Quellcode.
    So kannst du leicht vergleichen, was ich hinzugefügt und auskommentiert habe.
    Ich weiß ja nicht, was du mit deinem Programm machen willst, aber in Prinzip könntest du deine Funktion(en) in den WinThread reinpacken.

    Das unten stehende Programm startet unsichtbar und erzeugt einen Thread. Dieser läuft ca. für 10 Sekunden, danach beendet er sich selbst und das Windowsprogramm und zeigt eine MessageBox an.
    Guckst du hier:

    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    DWORD WINAPI WinThread ( LPVOID lpv )
    {
    	BOOL bRunning = true;
    	HWND* phwnd = (HWND*) lpv;
    	TCHAR tbuf [256];
    
    	unsigned long n = 0;
    
    	while ( bRunning )
    	{
    		Sleep ( 1000 );
    		n++;
    		if ( n==10 )
    			bRunning = FALSE;
    	}
    
    	_stprintf( tbuf, _T("While loop was passed %lu times.\nProgram is going to terminate."), n );
    	MessageBox ( *phwnd, tbuf, _T("Info"), MB_OK );
    	SendMessage ( *phwnd, WM_DESTROY, 0, 0 );
    
    	return 0;
    }
    
    LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
      switch(msg)  
      {
    	   case WM_DESTROY:
          {
            PostQuitMessage(0);
            return 0;
          }
      }
      return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    {
      MSG  msg ;    
      HWND hwnd;
      WNDCLASS wc;
    
      HANDLE hThread;
      DWORD dwThreadID;
    
      wc.style         = CS_HREDRAW | CS_VREDRAW;
      wc.cbClsExtra    = 0;
      wc.cbWndExtra    = 0;
      wc.lpszClassName = TEXT( "Window" );
      wc.hInstance     = hInstance ;
      wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
      wc.lpszMenuName  = NULL;
      wc.lpfnWndProc   = WndProc;
      wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
      wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    
      RegisterClass(&wc);
      hwnd = CreateWindow( wc.lpszClassName, TEXT("Window"),
                    WS_OVERLAPPEDWINDOW, // | WS_VISIBLE,
                    100, 100, 250, 150, NULL, NULL, hInstance, NULL);  
    
     // ShowWindow(hwnd, nCmdShow);
     // UpdateWindow(hwnd);
    
      hThread = CreateThread ( 0, 0, WinThread, &hwnd, 0, &dwThreadID );
      if ( NULL == hThread )
    	MessageBox ( NULL, _T("CreateThread failed."), _T("Error"), MB_OK );
    
      while( GetMessage(&msg, NULL, 0, 0)) {
        DispatchMessage(&msg);
      }
    
      return (int) msg.wParam;
    }
    

    Gruß,
    m.v.g.



  • Vielen dank schon mal, aber wenn ich das Programm kompiliere erscheint das DOS Fenster und nach 10 Sekunden die Message. Wenn ich dann auf OK klicke beendet sich das Programm. Aber das DOS Fenster sehe ich ja trotzdem noch. Kann es vielleicht sein, dass ich irgendwelche besonderen Einstellungen habe, damit das Fenster immer sichtbar ist? 😕

    MfG

    Tim



  • Wenn Du überhaupt keine Ausgabe/Anzeige brauchst, nimm einfach statt Deiner

    int main()
    {
    ...
    }

    diese hier:

    #include <windows.h>
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    {
    ...
    }

    Je nach Compiler mußt Du dann noch einen Compilerschalter setzen, der angibt, daß ein Windowsprogramm gelinkt werden soll.



  • Höhlenmensch schrieb:

    Vielen dank schon mal, aber wenn ich das Programm kompiliere erscheint das DOS Fenster

    Welchen Compiler benutzt Du?



  • Höhlenmensch schrieb:

    Vielen dank schon mal, aber wenn ich das Programm kompiliere erscheint das DOS Fenster und nach 10 Sekunden die Message. Wenn ich dann auf OK klicke beendet sich das Programm. Aber das DOS Fenster sehe ich ja trotzdem noch. Kann es vielleicht sein, dass ich irgendwelche besonderen Einstellungen habe, damit das Fenster immer sichtbar ist? 😕

    MfG

    Tim

    dann hast du bestimmt irgendwo int main() stehen.
    falls du msvc hast musst du eine win32 applikation erstellen.

    Belli schrieb:

    #include <windows.h>
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
    {
    ...
    }

    auf die idee bin ich noch gar nicht gekommen, das ist natürlich viel einfacher, wenn man keine windows-nachrichten verarbeiten muss. 👍



  • ich benutze DEV-Cpp



  • Ich habe da Windows Application, Console Application und Hallo World was in frage käme, aber bei allen ist das CMD Fenster zu sehen 😞



  • Höhlenmensch schrieb:

    ich benutze DEV-Cpp

    Diese IDE benutzt glaube ich den MinGW - Compiler. Da mußt Du für das Erzeugen eines Windows-Programms den Schalter -mwindows für den Linker setzen.



  • Wie schon angedeutet: Eigentlich haengt es nur von einem einzigen flag im .exe-Dateihaeder ab, ob ein Windows-Programm ein "Konsolenprogramm" ist und automatisch eine Konsole zugeordnet bekommt, oder nicht. Das muss sich IMHO also tatsaechlich ueber einen switch im Linker einstellen lassen.



  • Nobuo T schrieb:

    Wie schon angedeutet: ...

    Wieso angedeutet? Ich habe das zweimal deutlich geschrieben.



  • Sry, konnte ich nicht erkennen. 2 Beitraege habe ich gefunden, die in etwa in diese Richtung zielten und in einem davon

    Belli schrieb:

    Je nach Compiler mußt Du dann noch einen Compilerschalter setzen, der angibt, daß ein Windowsprogramm gelinkt werden soll.

    schreibst du nichts von einem Linker-Schalter
    und im anderen

    Belli schrieb:

    Da mußt Du für das Erzeugen eines Windows-Programms den Schalter -mwindows für den Linker setzen.

    ist irgendwie nur die Rede von einem "Windows-Programm".

    Ein Konsolenprogramm ist nach meinem Verstaendnis auch ein Windows-Programm ( - ein Programm, das nativ in Windows laeuft).

    Ferner kenne ich mich zwar nicht so mit C-artigen Compilern aus, aber im Prinzip sollte es doch im Hinblick auf die Konsolen-Problematik hier auch ein wenig egal sein, ob man da nun mit WinMain oder Main arbeitet?



  • Nobuo T schrieb:

    Ferner kenne ich mich zwar nicht so mit C-artigen Compilern aus, aber im Prinzip sollte es doch im Hinblick auf die Konsolen-Problematik hier auch ein wenig egal sein, ob man da nun mit WinMain oder Main arbeitet?

    Ich bin mir nicht sicher, ob ich richtig verstehe, was Du damit sagen willst. Es ist aber schon mal so, daß Main eine andere Signatur hat, als WinMain. Und der vom Linker erzeugte Lade/StartCode ist ein anderer, bzw. muß ein anderer sein. Das weißt Du als Assembler-Mensch wahrscheinlich viel besser.

    Wenn man dem MinGW - Linker nicht sagt, daß er ein Windowsprogramm (im Sinne von Nicht-Konsolenprogramm) linken soll, passiert nix Schlimmes, er öffnet einfach ein Konsolenfenster neben dem eigentlichen Programm.
    Wenn ich mich richtig erinnere, erzeugen die MS-Compiler erst gar keinen Ladecode, wenn die verwendete main nicht zu den verwendeten Linker-Einstellungen passt - aber das ist lange her, vielleicht hab ich das auch falsch in Erinnerung.

    Quintessenz ist wie schon festgestellt: Wenn WinMain verwendet UND die passende Linkereinstellung gewählt wird, wird keine Konsole geöffnet.
    PS
    Ich schrieb zwar in meinem ersten von Dir zitierten Posting 'Compilerschalter', aber als beabsichtigte Wirkung habe ich das Linkverhalten genannt.
    C/C++ - Programmierer lassen den Linklauf häufig vom Compiler initiieren, anstatt getrennt zu kompilieren und linken. Obwohl ... wenn jemand eine IDE benutzt, hängt es ja auch schon wieder von der ab ...
    Egal, ich denke, der TE sollte sein Problem jetzt lösen können.



  • Höhlenmensch schrieb:

    Ich habe da Windows Application, Console Application und Hallo World was in frage käme, aber bei allen ist das CMD Fenster zu sehen 😞

    was ist das für eine dev-cpp version? ich habe auch dev-cpp und bekomme automatisch ein windows-grundgerüst generiert, wenn ich windows application als startprojekt wähle.


Anmelden zum Antworten