J'ai cherché sur Google pour savoir comment cacher sa propre fenêtre de console. Étonnamment, les seules solutions que j'ai pu trouver étaient les solutions simples qui impliquaient FindWindow()
pour trouver la fenêtre de la console par son titre . J'ai creusé un peu plus profondément dans l'API Windows et découvert qu'il existe un moyen beaucoup plus simple et meilleur. Je voulais donc le publier ici pour que d'autres le trouvent.
Comment cachez-vous (et affichez-vous) la fenêtre de la console associée à ma propre application console C #?
Voici comment:
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int SW_SHOW = 5;
var handle = GetConsoleWindow();
// Hide
ShowWindow(handle, SW_HIDE);
// Show
ShowWindow(handle, SW_SHOW);
Il suffit d'aller dans les propriétés de l'application et de modifier le type de sortie de Application console à application Windows.
Pourquoi avez-vous besoin d'une application console si vous souhaitez masquer la console elle-même? =)
Je recommande de définir le type de sortie du projet sur Application Windows au lieu de l'application Console. Il ne vous montrera pas la fenêtre de la console, mais exécutera toutes les actions, comme le fait l’application Console.
Vous pouvez effectuer l'inverse et définir le type de sortie de l'application sur: Application Windows. Ajoutez ensuite ce code au début de l'application.
[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();
private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console
static void Main(string[] args)
{
if (showConsole)
{
AllocConsole();
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
}
//Your application code
}
Ce code affichera la console si showConsole
est true
Voir mon post ici:
Afficher la console dans une application Windows
Vous pouvez créer une application Windows (avec ou sans fenêtre) et afficher la console comme vous le souhaitez. À l'aide de cette méthode, la fenêtre de la console n'apparaît jamais sauf si vous la montrez explicitement. Je l'utilise pour les applications en mode double que je souhaite exécuter en mode console ou en mode gui, en fonction de la manière dont elles sont ouvertes.
"Juste pour cacher" vous pouvez:
Modifiez le type de sortie de Application console en Application Windows ,
Et au lieu de Console.Readline/key
, vous pouvez utiliser new ManualResetEvent(false).WaitOne()
à la fin pour que l'application continue de fonctionner.
Si vous ne voulez pas dépendre du titre de la fenêtre, utilisez ceci:
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
...
IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
ShowWindow(h, 0);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormPrincipale());
Si vous ne rencontrez pas de problème pour intégrer une petite application batch, il existe un programme appelé Cmdow.exe qui vous permettra de masquer les fenêtres de la console en fonction du titre de la console.
Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();
Ajoutez l'exe à la solution, définissez l'action de génération sur "Contenu", définissez l'option Copier dans le répertoire de sortie selon vos besoins, et cmdow masquera la fenêtre de la console lors de son exécution.
Pour rendre la console visible à nouveau, il vous suffit de modifier les arguments.
HideConsole.StartInfo.Arguments = "MyConsole /Vis";