Création d’une console

Le système crée une console quand il démarre un processus de console, qui est un processus en mode caractère dont le point d’entrée est la fonction main. Par exemple, le système crée une console quand il démarre le processeur de commande cmd.exe. Quand le processeur de commande démarre un nouveau processus de console, l’utilisateur peut spécifier si le système crée une console pour le nouveau processus ou s’il hérite de la console du processeur de commandes.

Un processus peut créer une console en utilisant une des méthodes suivantes :

  • Une interface graphique utilisateur (GUI) ou un processus de console peut utiliser la fonction CreateProcess avec CREATE_NEW_CONSOLE pour créer un processus de console avec une nouvelle console. (Par défaut, un processus de console hérite de la console de son parent, et il n’y a pas de garantie que l’entrée est reçue par le processus auquel elle était destinée.)
  • Une interface graphique utilisateur ou un processus de console qui n’est pas actuellement attaché à une console peut utiliser la fonction AllocConsole pour créer une console. (Les processus GUI ne sont pas attachés à une console lorsqu’ils sont créés. Les processus de console ne sont pas attachés à une console s’ils sont créés à l’aide de CreateProcess avec DETACHED_PROCESS.)

En règle générale, un processus utilise AllocConsole pour créer une console quand une erreur se produit et demande une interaction avec l’utilisateur. Par exemple, un processus GUI peut créer une console quand une erreur se produit qui l’empêche d’utiliser son interface graphique normale, ou un processus de console qui n’interagit normalement pas avec l’utilisateur peut créer une console pour afficher une erreur.

Un processus peut aussi créer une console en spécifiant l’indicateur CREATE_NEW_CONSOLE dans un appel à CreateProcess. Cette méthode crée une console qui est accessible au processus enfant, mais pas au processus parent. Des consoles distinctes permettent aux processus parents et enfants d’interagir sans conflit avec l’utilisateur. Si cet indicateur n’est pas spécifié lors de la création d’un processus de console, les deux processus sont attachés à la même console, et il n’y a pas de garantie que le processus correct recevra l’entrée qui lui est destinée. Les applications peuvent éviter les confusions en créant des processus enfants qui n’héritent pas des handles de la mémoire tampon d’entrée, ou en n’autorisant qu’un seul processus enfant à la fois pour hériter d’un handle de mémoire tampon d’entrée tout en empêchant le processus parent de lire l’entrée de la console jusqu’à ce que l’enfant ait terminé.

La création d’une console génère une nouvelle fenêtre de console ainsi que des mémoires tampons d’E/S distinctes pour la sortie à l’écran et l’entrée de l’utilisateur. Le processus associé à la nouvelle console utilise la fonction GetStdHandle pour récupérer les handles des mémoires tampons d’entrée et d’écran de la nouvelle console. Ces handles permettent au processus d’accéder à la console.

Quand un processus utilise CreateProcess, il peut spécifier une structure STARTUPINFO, dont les membres contrôlent les caractéristiques de la première nouvelle console (le cas échéant) créée pour le processus enfant. La structure STARTUPINFO spécifiée dans l’appel à CreateProcess affecte une console créée si l’indicateur CREATE_NEW_CONSOLE est spécifié. Elle affecte également une console créée si le processus enfant utilise par la suite AllocConsole. Les caractéristiques suivantes de la console peuvent être spécifiées :

  • Taille de la nouvelle fenêtre de console, en cellules de caractères
  • Emplacement de la nouvelle fenêtre de console, en coordonnées de pixels d’écran
  • Taille de la mémoire tampon d’écran de la nouvelle console, en cellules de caractères
  • Attributs de couleur de texte et d’arrière-plan de la mémoire tampon d’écran de la nouvelle console
  • Nom d’affichage de la barre de titre de la fenêtre de la nouvelle console

Le système utilise les valeurs par défaut si les valeurs de STARTUPINFO ne sont pas spécifiées. Un processus enfant peut utiliser la fonction GetStartupInfo pour déterminer les valeurs dans sa structure STARTUPINFO.

Un processus ne peut pas changer l’emplacement de sa fenêtre de console sur l’écran, mais les fonctions de console suivantes sont disponibles pour définir ou récupérer les autres propriétés spécifiées dans la structure STARTUPINFO.

Fonction Description
GetConsoleScreenBufferInfo Récupère la taille de la fenêtre, la taille de la mémoire tampon d’écran et les attributs de couleur.
SetConsoleWindowInfo Change la taille de la fenêtre de console.
SetConsoleScreenBufferSize Change la taille de la mémoire tampon d’écran de console.
SetConsoleTextAttribute Définit les attributs de couleur.
SetConsoleTitle Définit le titre de la fenêtre de console.
GetConsoleTitle Récupère le titre de la fenêtre de console.

Un processus peut utiliser la fonction FreeConsole pour se détacher d’une console héritée ou d’une console créée par AllocConsole.

Un processus peut utiliser la fonction AttachConsole pour s’attacher à une autre session de console existante après avoir utilisé FreeConsole pour se détacher de sa propre session (ou s’il n’y a aucune autre session attachée).