{"id":963,"date":"2025-12-05T15:44:20","date_gmt":"2025-12-05T14:44:20","guid":{"rendered":"https:\/\/www.silverice.it\/IpercubeTechWP1\/?page_id=963"},"modified":"2025-12-05T15:44:20","modified_gmt":"2025-12-05T14:44:20","slug":"console-window","status":"publish","type":"page","link":"https:\/\/www.silverice.it\/IpercubeTechWP1\/vb-classes\/console-window\/","title":{"rendered":"Console Window"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Provides methods to attach, detach, show, and hide a console window in Windows applications that do not normally have a console.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allows attaching a console window to a WinForms\/WPF application for logging\/debugging.<\/li>\n\n\n\n<li>Automatically restores standard input\/output\/error streams when attaching.<\/li>\n\n\n\n<li>Supports hiding or showing the console without detaching it.<\/li>\n\n\n\n<li>Releasing the console resets the Console streams to null or empty readers\/writers.<\/li>\n\n\n\n<li>Can detect whether a console is already attached.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This class uses\u00a0<strong>kernel32.dll<\/strong>\u00a0and\u00a0<strong>user32.dll<\/strong>\u00a0interop to manage the native console window.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:75%\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column page-snippet is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Geist-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-Geist-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">VB<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Option Strict On\nOption Explicit On\nOption Infer On\n\nImports System.IO\nImports System.Runtime.InteropServices\n\nPublic NotInheritable Class ConsoleWindow\n\n    Private Sub New()\n    End Sub\n\n    &lt;DllImport(\"kernel32.dll\", SetLastError:=True)>\n    Private Shared Function AllocConsole() As Boolean\n    End Function\n\n    &lt;DllImport(\"kernel32.dll\", SetLastError:=True)>\n    Private Shared Function FreeConsole() As Boolean\n    End Function\n\n    &lt;DllImport(\"kernel32.dll\", SetLastError:=True)>\n    Private Shared Function GetConsoleWindow() As IntPtr\n    End Function\n\n    &lt;DllImport(\"user32.dll\", SetLastError:=True)>\n    Private Shared Function ShowWindow(hWnd As IntPtr, nCmdShow As Integer) As Boolean\n    End Function\n\n    Private Const SW_HIDE As Integer = 0\n    Private Const SW_SHOW As Integer = 5\n\n    ''' &lt;summary>\n    ''' Checks if a console window is currently attached to the process.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;returns>&lt;c>True&lt;\/c> if a console is attached; otherwise, &lt;c>False&lt;\/c>.&lt;\/returns>\n    ''' &lt;remarks>\n    ''' This method calls &lt;c>GetConsoleWindow()&lt;\/c> to determine if a console is active.\n    ''' &lt;\/remarks>\n    Public Shared Function IsConsoleAttached() As Boolean\n        Return GetConsoleWindow() &lt;> IntPtr.Zero\n    End Function\n\n    ''' &lt;summary>\n    ''' Ensures that a console window is attached to the current process.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;remarks>\n    ''' &lt;list type=\"bullet\">\n    ''' &lt;item>&lt;description>If no console is currently attached, this method allocates a new one.&lt;\/description>&lt;\/item>\n    ''' &lt;item>&lt;description>It also redirects the standard input\/output\/error streams to the new console.&lt;\/description>&lt;\/item>\n    ''' &lt;item>&lt;description>Useful for attaching a console to GUI applications at runtime.&lt;\/description>&lt;\/item>\n    ''' &lt;\/list>\n    ''' &lt;\/remarks>\n    Public Shared Sub EnsureAttached()\n        If GetConsoleWindow() = IntPtr.Zero Then\n            AllocConsole()\n            ReopenConsoleStreams()\n        End If\n    End Sub\n\n    ''' &lt;summary>\n    ''' Hides the console window, if currently attached.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;remarks>\n    ''' This method does not detach the console, it only hides it from view.\n    ''' &lt;\/remarks>\n    Public Shared Sub Hide()\n        Dim h = GetConsoleWindow()\n        If h &lt;> IntPtr.Zero Then ShowWindow(h, SW_HIDE)\n    End Sub\n\n    ''' &lt;summary>\n    ''' Shows the console window. If no console is attached, it allocates one.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;remarks>\n    ''' &lt;list type=\"bullet\">\n    ''' &lt;item>&lt;description>If a console is already attached, it is simply shown using &lt;c>ShowWindow&lt;\/c>.&lt;\/description>&lt;\/item>\n    ''' &lt;item>&lt;description>If no console is attached, a new one is allocated and I\/O streams are initialized.&lt;\/description>&lt;\/item>\n    ''' &lt;\/list>\n    ''' &lt;\/remarks>\n    Public Shared Sub ShowUp()\n        Dim h = GetConsoleWindow()\n        If h = IntPtr.Zero Then\n            AllocConsole()\n            ReopenConsoleStreams()\n        Else\n            ShowWindow(h, SW_SHOW)\n        End If\n    End Sub\n\n    ''' &lt;summary>\n    ''' Detaches the console from the current process and nullifies standard I\/O streams.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;remarks>\n    ''' &lt;list type=\"bullet\">\n    ''' &lt;item>&lt;description>This method sets &lt;c>Console.Out&lt;\/c> and &lt;c>Console.Error&lt;\/c> to &lt;c>TextWriter.Null&lt;\/c>.&lt;\/description>&lt;\/item>\n    ''' &lt;item>&lt;description>It also sets &lt;c>Console.In&lt;\/c> to a dummy &lt;c>StringReader&lt;\/c>.&lt;\/description>&lt;\/item>\n    ''' &lt;item>&lt;description>Then it calls &lt;c>FreeConsole()&lt;\/c> to release the native console.&lt;\/description>&lt;\/item>\n    ''' &lt;\/list>\n    ''' &lt;\/remarks>\n    Public Shared Sub Detach()\n        Dim h = GetConsoleWindow()\n        If h &lt;> IntPtr.Zero Then\n            Console.SetOut(TextWriter.Null)\n            Console.SetError(TextWriter.Null)\n            Console.SetIn(New StringReader(String.Empty))\n            FreeConsole()\n        End If\n    End Sub\n\n    ''' &lt;summary>\n    ''' Rebinds the standard console input\/output\/error streams to the native console.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;remarks>\n    ''' Called internally after allocating a new console to ensure &lt;c>Console.ReadLine&lt;\/c>,\n    ''' &lt;c>Console.WriteLine&lt;\/c>, etc. work correctly.\n    ''' &lt;\/remarks>\n    Private Shared Sub ReopenConsoleStreams()\n        Dim stdOut As Stream = Console.OpenStandardOutput()\n        Dim wOut As New StreamWriter(stdOut) With {.AutoFlush = True}\n        Console.SetOut(wOut)\n\n        Dim stdErr As Stream = Console.OpenStandardError()\n        Dim wErr As New StreamWriter(stdErr) With {.AutoFlush = True}\n        Console.SetError(wErr)\n\n        Dim stdIn As Stream = Console.OpenStandardInput()\n        Dim rIn As New StreamReader(stdIn)\n        Console.SetIn(rIn)\n    End Sub\n\nEnd Class\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Option Strict On<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">Option Explicit <\/span><span style=\"color: #D4D4D4\">On<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Option Infer On<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Imports System.IO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Imports System.Runtime.InteropServices<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> NotInheritable<\/span><span style=\"color: #569CD6\"> Class <\/span><span style=\"color: #D4D4D4\">ConsoleWindow<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private Sub New<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #DCDCAA\">DllImport<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;kernel32.dll&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> SetLastError<\/span><span style=\"color: #D4D4D4\">:=<\/span><span style=\"color: #569CD6\">True<\/span><span style=\"color: #D4D4D4\">)&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">AllocConsole<\/span><span style=\"color: #D4D4D4\">() As <\/span><span style=\"color: #4EC9B0\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #DCDCAA\">DllImport<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;kernel32.dll&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> SetLastError<\/span><span style=\"color: #D4D4D4\">:=<\/span><span style=\"color: #569CD6\">True<\/span><span style=\"color: #D4D4D4\">)&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">FreeConsole<\/span><span style=\"color: #D4D4D4\">() As <\/span><span style=\"color: #4EC9B0\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #DCDCAA\">DllImport<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;kernel32.dll&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> SetLastError<\/span><span style=\"color: #D4D4D4\">:=<\/span><span style=\"color: #569CD6\">True<\/span><span style=\"color: #D4D4D4\">)&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">GetConsoleWindow<\/span><span style=\"color: #D4D4D4\">() As <\/span><span style=\"color: #4EC9B0\">IntPtr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &lt;<\/span><span style=\"color: #DCDCAA\">DllImport<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;user32.dll&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> SetLastError<\/span><span style=\"color: #D4D4D4\">:=<\/span><span style=\"color: #569CD6\">True<\/span><span style=\"color: #D4D4D4\">)&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">ShowWindow<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">hWnd<\/span><span style=\"color: #D4D4D4\"> As <\/span><span style=\"color: #4EC9B0\">IntPtr<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> nCmdShow<\/span><span style=\"color: #D4D4D4\"> As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\">) As <\/span><span style=\"color: #4EC9B0\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private Const <\/span><span style=\"color: #D4D4D4\">SW_HIDE As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private Const <\/span><span style=\"color: #D4D4D4\">SW_SHOW As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">5<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Checks if a console window is currently attached to the process.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;returns&gt;&lt;c&gt;True&lt;\/c&gt; if a console is attached; otherwise, &lt;c&gt;False&lt;\/c&gt;.&lt;\/returns&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; This method calls &lt;c&gt;GetConsoleWindow()&lt;\/c&gt; to determine if a console is active.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">IsConsoleAttached<\/span><span style=\"color: #D4D4D4\">() As <\/span><span style=\"color: #4EC9B0\">Boolean<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GetConsoleWindow<\/span><span style=\"color: #D4D4D4\">() &lt;&gt; IntPtr.Zero<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Ensures that a console window is attached to the current process.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;list type=&quot;bullet&quot;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;If no console is currently attached, this method allocates a new one.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;It also redirects the standard input\/output\/error streams to the new console.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;Useful for attaching a console to GUI applications at runtime.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/list&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Sub <\/span><span style=\"color: #DCDCAA\">EnsureAttached<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">GetConsoleWindow<\/span><span style=\"color: #D4D4D4\">() = IntPtr.Zero <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">AllocConsole<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">ReopenConsoleStreams<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Hides the console window, if currently attached.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; This method does not detach the console, it only hides it from view.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Sub <\/span><span style=\"color: #DCDCAA\">Hide<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> h <\/span><span style=\"color: #D4D4D4\">= <\/span><span style=\"color: #DCDCAA\">GetConsoleWindow<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> &lt;&gt; IntPtr.Zero <\/span><span style=\"color: #C586C0\">Then<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">ShowWindow<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> SW_HIDE<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Shows the console window. If no console is attached, it allocates one.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;list type=&quot;bullet&quot;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;If a console is already attached, it is simply shown using &lt;c&gt;ShowWindow&lt;\/c&gt;.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;If no console is attached, a new one is allocated and I\/O streams are initialized.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/list&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Sub <\/span><span style=\"color: #DCDCAA\">ShowUp<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> h <\/span><span style=\"color: #D4D4D4\">= <\/span><span style=\"color: #DCDCAA\">GetConsoleWindow<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> = IntPtr.Zero <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">AllocConsole<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">ReopenConsoleStreams<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">ShowWindow<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> SW_SHOW<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Detaches the console from the current process and nullifies standard I\/O streams.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;list type=&quot;bullet&quot;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;This method sets &lt;c&gt;Console.Out&lt;\/c&gt; and &lt;c&gt;Console.Error&lt;\/c&gt; to &lt;c&gt;TextWriter.Null&lt;\/c&gt;.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;It also sets &lt;c&gt;Console.In&lt;\/c&gt; to a dummy &lt;c&gt;StringReader&lt;\/c&gt;.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;item&gt;&lt;description&gt;Then it calls &lt;c&gt;FreeConsole()&lt;\/c&gt; to release the native console.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/list&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Sub <\/span><span style=\"color: #DCDCAA\">Detach<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> h <\/span><span style=\"color: #D4D4D4\">= <\/span><span style=\"color: #DCDCAA\">GetConsoleWindow<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\"> &lt;&gt; IntPtr.Zero <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Console.<\/span><span style=\"color: #DCDCAA\">SetOut<\/span><span style=\"color: #D4D4D4\">(TextWriter.<\/span><span style=\"color: #569CD6\">Null<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Console.<\/span><span style=\"color: #DCDCAA\">SetError<\/span><span style=\"color: #D4D4D4\">(TextWriter.<\/span><span style=\"color: #569CD6\">Null<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Console.<\/span><span style=\"color: #DCDCAA\">SetIn<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">New <\/span><span style=\"color: #DCDCAA\">StringReader<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #569CD6\">Empty<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">FreeConsole<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Rebinds the standard console input\/output\/error streams to the native console.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Called internally after allocating a new console to ensure &lt;c&gt;Console.ReadLine&lt;\/c&gt;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;c&gt;Console.WriteLine&lt;\/c&gt;, etc. work correctly.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Sub <\/span><span style=\"color: #DCDCAA\">ReopenConsoleStreams<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> stdOut <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Stream<\/span><span style=\"color: #D4D4D4\"> = Console.<\/span><span style=\"color: #DCDCAA\">OpenStandardOutput<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> wOut <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">StreamWriter<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">stdOut<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">With<\/span><span style=\"color: #D4D4D4\"> {.<\/span><span style=\"color: #9CDCFE\">AutoFlush<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> True<\/span><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        Console.<\/span><span style=\"color: #DCDCAA\">SetOut<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">wOut<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> stdErr <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Stream<\/span><span style=\"color: #D4D4D4\"> = Console.<\/span><span style=\"color: #DCDCAA\">OpenStandardError<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> wErr <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">StreamWriter<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">stdErr<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">With<\/span><span style=\"color: #D4D4D4\"> {.<\/span><span style=\"color: #9CDCFE\">AutoFlush<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> True<\/span><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        Console.<\/span><span style=\"color: #DCDCAA\">SetError<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">wErr<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> stdIn <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Stream<\/span><span style=\"color: #D4D4D4\"> = Console.<\/span><span style=\"color: #DCDCAA\">OpenStandardInput<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> rIn <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">StreamReader<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">stdIn<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        Console.<\/span><span style=\"color: #DCDCAA\">SetIn<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">rIn<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">End Class<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Provides methods to attach, detach, show, and hide a console window in Windows applications that do not normally have a console. This class uses\u00a0kernel32.dll\u00a0and\u00a0user32.dll\u00a0interop to manage the native console window.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":943,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-963","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/963","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/comments?post=963"}],"version-history":[{"count":2,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/963\/revisions"}],"predecessor-version":[{"id":965,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/963\/revisions\/965"}],"up":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/943"}],"wp:attachment":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/media?parent=963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}