Consolenfenster maximieren



  • Hallo Leute,

    ich schreibe gerade ein kleine Consolen-Anwendung in C++/CLI.
    Da dieses Programm ein Menü enthält, würde ich gerne das Fenster der Console maximieren.

    Ist das Möglich?

    Vielen Dank für die Hilfe.

    Gruß,

    Erwin.



  • nicht wirklich ... die Konsole ist abhängig vom Ausgabegerät ... Du kannst aber die Software-Konsole über den Befehl mode.exe beeinflussen



  • SetConsoleDisplayMode
    http://msdn.microsoft.com/en-us/library/ms686028
    mit CONSOLE_FULLSCREEN_MODE

    Oder meintest Du eher:
    Console::SetWindowSize



  • Danke Jochen, genau mit CONSOLE_FULLSCREEN_MODE habe ich vor.
    Habe den Code bei mir eingebaut, nur die Konsole verändert ihr Größe aber nicht.
    Hier mal mein Code...

    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    
    using namespace System;
    
    int NT_SetConsoleDisplayMode(HANDLE hOutputHandle, DWORD dwNewMode)
    {
    typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, LPDWORD);
    
    SCDMProc_t SetConsoleDisplayMode;
    HMODULE hKernel32;
    BOOL bFreeLib = FALSE, ret;
    const char KERNEL32_NAME[] = "kernel32.dll";
    
    hKernel32 = GetModuleHandleA(KERNEL32_NAME);
    if (hKernel32 == NULL)
    {
    	hKernel32 = LoadLibraryA(KERNEL32_NAME);
    	if (hKernel32 == NULL)
    	{
    		return FALSE;
    	}
    	bFreeLib = true;
    }
    
    SetConsoleDisplayMode = (SCDMProc_t)GetProcAddress(hKernel32, "SetConsoleDisplayMode");
    if (SetConsoleDisplayMode == NULL)
    {
    	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
    	ret = FALSE;
    }
    else
    {
    	DWORD dummy;
    	ret = SetConsoleDisplayMode(hOutputHandle, dwNewMode, &dummy);
    }
    
    if (bFreeLib)
    	FreeLibrary(hKernel32);
    	return ret;
    }
    
    int main(array<System::String ^> ^args)
    {
    	NT_SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ),1);
    	std::cin.get();	
    	return 0;
    }
    

    Wird ohne Fehler übersetzt und auch ausgeführt, nur eben die Konsole bleibt im unveränderten Zustand.

    Kann da bitte mal jemand drüber gucken? 😉

    Danke,

    Erwin.



  • Was sagt der Rückgabewert? und GetLastError?



  • Rückgabewert ist 0

    Und kein Fehler

    SetLastError = SetLastError+0 // method+offset = unsigned int = <Nicht definierter Wert>

    Verstehe ich nicht wirklich...

    Du???



  • Kann mir keiner helfen?



  • Was zeigt den GetLastError an?
    Hier ist ein *simpler* Code, der das Problem veranschaulicht:

    #define WINVER 0x0500
    #include <windows.h>
    
    int main()
    {
      if (SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE), CONSOLE_FULLSCREEN_MODE, NULL) == FALSE)
      {
        DWORD dw = GetLastError();
        System::Console::WriteLine("{0}", dw);
      }
      System::Console::ReadKey();
    }
    

    Du machst das aber nicht via RDP, oder? Dann geht es nicht, da RDP kein Console-FullScreen unterstützt....



  • Nein ich mache das nicht per RDP.

    Die Ausgabe ist 87.

    Hoffe das Hilft Dir weiter....

    Gruß,

    Erwin



  • Hier findest Du die Error Codes:
    http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx

    Wobei Error Code 87 folgendes bedeutet:
    87 ➡ ERROR_INVALID_PARAMETER ➡ The parameter is incorrect.

    Da hast Du offenbar irgendwo ein ungültiger Parameter angegeben.

    Simon



  • Hallo,

    Jochens Code funktioniert (fehlerfrei), wenn man noch einen gültigen Zeiger übergibt:

    int main() 
    { 
      COORD dummy;
      if (!SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE), CONSOLE_FULLSCREEN_MODE, &dummy)) 
      { 
        DWORD dw = GetLastError(); 
        System::Console::WriteLine("{0}", dw); 
      } 
      System::Console::ReadKey(); 
    }
    

    also sollte *Erwin L.*s Code so:

    ...
    
    // warum LPDWORD als letzter Parameter? Die Doku sagt PCOORD, macht hier noch kein Problem, aber später wird dann auch DWORD übergeben, was nicht korrekt ist
    typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, PCOORD);
    
    if (SetConsoleDisplayMode == NULL)
    {
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        ret = FALSE;
    }
    else
    {
        // hier kein DWORD, erwartet wird eine COORD-Struktur, kann zu "ungültigem Parameter" führen
        //DWORD dummy;
        COORD dummy;
        ret = SetConsoleDisplayMode(hOutputHandle, dwNewMode, &dummy);
    }
    ...
    
    int main(array<System::String ^> ^args)
    {
        NT_SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), CONSOLE_FULLSCREEN_MODE);
        std::cin.get();    
        return 0;
    }
    

    funktionieren.

    MfG,

    Probe-Nutzer



  • Dann ist das aber ein Docu-Bug 😉 Dort steht nämlich "optional"...

    Kann ich auch so nicht bestätigen.. bei mir (XP) funktioniert sowohl der Code mit "NULL" als auch mit "&dummy".
    Wobei, wenn "NULL" übergeben wurde, kommt Error 12 zurpck aber es wird trotzdem umgeschaltet 😉



  • Hallo,

    Wobei, wenn "NULL" übergeben wurde, kommt Error 12 zurpck aber es wird trotzdem umgeschaltet

    Genau das wollte ich auch nur ausdrücken (deswegen fehlerfrei in Klammern von mir gesetzt oben, zugegeben, blieb aber trotzdem etwas unklar, wie ich es meinte), umgeschaltet wird ohne Zweifel 😉

    Mit "meiner" Version gibt es keinen Error 12, diese kleine "Unschönheit" wollte ich hiermit nur beseitigen.

    MfG,

    Probe-Nutzer



  • Danke für die Hilfen, aber bei mir funzt der Code immer noch nicht.
    Kann das vllt. an Vista liegen?

    Hab das so geschrieben, aber er kennt CONSOLE_FULLSCREEN_MODE nicht...

    #define _WIN32_WINNT 0x0500 // habe 2000 prof.
    #include "stdafx.h"
    #include "stdafx.h" 
    #include <windows.h> 
    #include <iostream> 
    
    using namespace System; 
    using namespace std;
    
    int NT_SetConsoleDisplayMode(HANDLE hOutputHandle, DWORD dwNewMode) 
    { 
    	typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, PCOORD); 
    
    	SCDMProc_t SetConsoleDisplayMode; 
    	HMODULE hKernel32; 
    	BOOL bFreeLib = FALSE, ret; 
    	const char KERNEL32_NAME[] = "kernel32.dll"; 
    
    	hKernel32 = GetModuleHandleA(KERNEL32_NAME); 
    	if (hKernel32 == NULL) 
    	{ 
    		hKernel32 = LoadLibraryA(KERNEL32_NAME); 
    		if (hKernel32 == NULL) 
    		{ 
    			return FALSE; 
    		} 
    		bFreeLib = true; 
    	} 
    
    	SetConsoleDisplayMode = (SCDMProc_t)GetProcAddress(hKernel32, "SetConsoleDisplayMode"); 
    
    	// warum LPDWORD als letzter Parameter? Die Doku sagt PCOORD, macht hier noch kein Problem, aber später wird dann auch DWORD übergeben, was nicht korrekt ist 
    	typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, PCOORD); 
    
    	if (SetConsoleDisplayMode == NULL) 
    	{ 
    		SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
    		ret = FALSE; 
    	} 
    	else 
    	{ 
    		// hier kein DWORD, erwartet wird eine COORD-Struktur, kann zu "ungültigem Parameter" führen 
    		//DWORD dummy; 
    		COORD dummy; 
    		ret = SetConsoleDisplayMode(hOutputHandle, dwNewMode, &dummy); 
    	}
    
    	if (bFreeLib) 
    	{
    		FreeLibrary(hKernel32); 
    	}
    		return ret; 
    } 
    
    int main(array<System::String ^> ^args) 
    { 
    	NT_SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), CONSOLE_FULLSCREEN_MODE); 
        std::cin.get(); 
        return 0; 
    }
    

    Ich komme nicht weiter...
    Woran liegt das???
    Oben nochmal mein Code...

    Gruß,

    Erwin :xmas2:



  • Vista unterstützt (nicht so ohne weiteres) tatsächlich keinen CONSOLE_FULLSCREEN_MODE, nachzulesen hier:

    http://support.microsoft.com/kb/926657/en-us

    Bei allen "Lösungen" die es da gibt, müsste man auf "Windows Aero"-Darstellung verzichten,z.B.:

    http://www.walkernews.net/2007/06/03/how-to-maximize-vista-command-prompt-window/

    http://www.mydigitallife.info/2007/06/27/workaround-to-this-system-does-not-support-full-screen-mode-in-windows-vista/

    MfG,

    Probe-Nutzer



  • Danke Euch Tausendfach.

    Muss ich wohl mit dem Fenster leben, nicht schön aber was soll es.

    Vielen Dank....

    Erwin


Anmelden zum Antworten