Erstellung einer Konsole

Das System erstellt eine neue Konsole, wenn ein Konsolenprozess gestartet wird. Dabei handelt es sich um einen Prozess im Zeichenmodus, dessen Einstiegspunkt die main-Funktion ist. Beispielsweise erstellt das System eine neue Konsole, wenn es den Befehlsprozessor cmd.exe startet. Wenn der Befehlsprozessor einen neuen Konsolenprozess startet, kann der Benutzer angeben, ob das System eine neue Konsole für den neuen Prozess erstellt oder ob es die Konsole des Befehlsprozessors erbt.

Ein Prozess kann eine Konsole mithilfe einer der folgenden Methoden erstellen:

  • Ein Prozess mit grafischer Benutzeroberfläche (GUI) oder ein Konsolenprozess kann die Funktion CreateProcess mit CREATE_NEW_CONSOLE verwenden, um einen Konsolenprozess mit einer neuen Konsole zu erstellen. (Standardmäßig erbt ein Konsolenprozess seine übergeordnete Konsole, und es lässt sich nicht sicherstellen, dass Eingaben von dem Prozess empfangen werden, für den sie bestimmt sind.)
  • Ein GUI- oder Konsolenprozess, der aktuell keiner Konsole zugeordnet ist, kann die Funktion AllocConsole verwenden, um eine neue Konsole zu erstellen. (GUI-Prozesse werden bei der Erstellung nicht an eine Konsole angefügt. Konsolenprozesse werden nicht an eine Konsole angefügt, wenn sie mithilfe von CreateProcess mit DETACHED_PROCESS erstellt werden.)

Normalerweise verwendet ein Prozess AllocConsole, um eine Konsole zu erstellen, wenn ein Fehler auftritt, der einen Benutzereingriff erfordert. Beispielsweise kann ein GUI-Prozess eine Konsole erstellen, wenn ein Fehler auftritt, der ihn daran hindert, seine normale grafische Oberfläche zu verwenden, oder ein Konsolenprozess, der normalerweise keine Benutzerinteraktion aufweist, kann eine Konsole erstellen, um einen Fehler anzuzeigen.

Ein Prozess kann darüber hinaus eine Konsole durch Festlegen des Flags CREATE_NEW_CONSOLE in einem Aufruf von CreateProcess erstellen. Mit dieser Methode wird eine neue Konsole erstellt, die für den untergeordneten Prozess, aber nicht für den übergeordneten Prozess zugänglich ist. Separate Konsolen ermöglichen es übergeordneten und untergeordneten Prozessen, konfliktfrei mit dem Benutzer zu interagieren. Wenn dieses Flag beim Erstellen eines Prozesses nicht angegeben wird, werden beide Prozesse der gleichen Konsole zugeordnet, und es ist nicht sichergestellt, dass der richtige Prozess die für ihn bestimmten Eingaben empfängt. Anwendungen können Verwirrung verhindern, indem sie untergeordnete Prozesse erstellen, die keine Handles vom Eingabepuffer erben, oder indem sie es jeweils nur einem untergeordneten Prozess ermöglichen, einen Eingabepufferhandle zu erben, während sie zugleich den übergeordneten Prozess am Lesen der Konsoleneingaben hindern, bis der untergeordnete Prozess beendet wurde.

Das Erstellen einer neuen Konsole führt zur Erstellung eines neuen Konsolenfensters sowie separater E/A-Bildschirmpuffer für Ausgabe an den Bildschirm und Eingabe durch den Benutzer. Der Prozess, der der neuen Konsole zugeordnet ist, verwendet die GetStdHandle-Funktion, um die Handles der Eingabe- und Bildschirmpuffer der neuen Konsole abzurufen. Diese Handles ermöglichen es dem Prozess, auf die Konsole zuzugreifen.

Wenn ein Prozess CreateProcess verwendet, kann er eine STARTUPINFO-Struktur angeben, deren Elemente die Eigenschaften der ersten neuen Konsole steuern (sofern vorhanden), die für den untergeordneten Prozess erstellt werden. Die im Aufruf von CreateProcess angegebene STARTUPINFO-Struktur wirkt sich auf eine erstellte Konsole aus, wenn das Flag CREATE_NEW_CONSOLE angegeben wird. Sie wirkt sich ebenfalls auf eine erstellte Konsole aus, wenn der untergeordnete Prozess anschließend AllocConsole verwendet. Die folgenden Konsolenmerkmale können angegeben werden:

  • Größe des neuen Konsolenfensters in Zeichenzellen
  • Position des neuen Konsolenfensters in Bildschirmkoordinaten
  • Größe des Bildschirmpuffers der neuen Konsole in Zeichenzellen
  • Attribute für Text- und Hintergrundfarbe des Bildschirmpuffers der neuen Konsole
  • Anzeigename für die Titelleiste des neuen Konsolenfensters

Das System verwendet Standardwerte, wenn keine Werte für STARTUPINFO angegeben werden. Ein untergeordneter Prozess kann die Funktion GetStartupInfo verwenden, um die Werte in seiner STARTUPINFO-Struktur zu bestimmen.

Ein Prozess kann die Position seines Konsolenfensters auf dem Bildschirm nicht ändern, es stehen aber die folgenden Konsolenfunktionen zur Verfügung, um die anderen in der Struktur STARTUPINFO angegebenen Eigenschaften festzulegen oder abzurufen.

Funktion Beschreibung
GetConsoleScreenBufferInfo Ruft die Fenstergröße, die Größe des Bildschirmpuffers und die Farbattribute ab.
SetConsoleWindowInfo Ändert die Größe des Konsolenfensters.
SetConsoleScreenBufferSize Ändert die Größe des Bildschirmpuffers der Konsole.
SetConsoleTextAttribute Legt die Farbattribute fest.
SetConsoleTitle Legt den Titel des Konsolenfensters fest.
GetConsoleTitle Ruft den Titel des Konsolenfensters ab.

Ein Prozess kann die Funktion FreeConsole verwenden, um sich von einer ererbten Konsole oder von einer mithilfe von AllocConsole erstellten Konsole zu trennen.

Ein Prozess kann die Funktion AttachConsole verwenden, um sich nach der Verwendung von FreeConsole zum Zweck der Trennung von seiner eigenen Sitzung (oder wenn keine weitere zugeordnete Sitzung vorhanden ist), einer anderen vorhandenen Konsolensitzung zuzuordnen.