J'ai cherché sur Google des informations sur la façon de cacher sa propre fenêtre de console. Étonnamment, les seules solutions que j'ai pu trouver étaient des solutions de piratage qui impliquaient FindWindow()
de trouver la fenêtre de la console par son titre . J'ai creusé un peu plus profondément l'API Windows et j'ai trouvé qu'il y avait un moyen bien meilleur et plus simple, alors je voulais le publier ici pour que d'autres le trouvent.
Comment masquer (et afficher) la fenêtre de console associée à ma propre application de 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);
la source
csproj
fichier manuellement. Visual Studio n'a pas d'interface graphique pour ce faire, mais il honorera le paramètre si vous modifiez lecsproj
fichier correctement.using System.Runtime.InteropServices;
const int SW_SHOWMINIMIZED = 2;
et puisShowWindow(handle, SW_SHOWMINIMIZED);
De cette façon, la console démarre non masquée, juste minimisée.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 montrera pas la fenêtre de la console, mais exécutera toutes les actions, comme le fait l'application de la console.
la source
TopShelf
vous permet également de fonctionner enConsoles
tant que service et cela brise celaVous pouvez faire l'inverse et définir le type de sortie d'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 affiche la console si
showConsole
esttrue
la source
Voir mon message ici:
Afficher la console dans l'application Windows
Vous pouvez créer une application Windows (avec ou sans fenêtre) et afficher la console comme vous le souhaitez. En utilisant cette méthode, la fenêtre de la console n'apparaît que si vous l'avez explicitement affichée. Je l'utilise pour les applications bi-mode que je souhaite exécuter en mode console ou en mode interface graphique en fonction de la façon dont elles sont ouvertes.
la source
«Juste pour vous cacher», vous pouvez:
Modifier le type de sortie de la console d' application à application Windows ,
Et au lieu de cela,
Console.Readline/key
vous pouvez utilisernew ManualResetEvent(false).WaitOne()
à la fin pour maintenir l'application en cours d'exécution.la source
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());
la source
Si vous n'avez pas de problème pour intégrer une petite application par lots, il existe ce 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 Copier dans le répertoire de sortie sur ce qui vous convient et cmdow masquera la fenêtre de la console lorsqu'elle sera exécutée.
Pour rendre la console à nouveau visible, il vous suffit de modifier les arguments
HideConsole.StartInfo.Arguments = "MyConsole /Vis";
la source