C#コンソールアプリケーションのコンソールウィンドウを表示/非表示にする


191

自分のコンソールウィンドウを非表示にする方法の情報を探してみました。驚くべきことに、私が見つけた唯一の解決策は、そのタイトルでFindWindow()コンソールウィンドウを見つけることに関与するハッキーな解決策でした。私はWindows APIを少し詳しく調べたところ、はるかに優れた簡単な方法があることがわかったので、他の人が見つけられるようにここに投稿したいと思いました。

自分のC#コンソールアプリケーションに関連付けられているコンソールウィンドウをどのように非表示(および表示)しますか?

回答:


265

方法は次のとおりです。

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);

14
ウィンドウはまだ最初は一時的に表示されます。アプリケーションの種類が変更されない限り、これを回避する方法はないと思いますか?
Ciaran Gallagher、2011

2
それを回避する方法があればいいのですが。そうすれば、デバッグモードのときにコンソールを表示できますが、通常の実行モードのときは、プログラムを実行して(ウィンドウなしで)終了します。
Vaccano 2011

8
@Vaccano:csprojファイルを手動で編集することによってのみ、アプリケーションをデバッグモードのコンソールアプリケーションにすることができます。Visual Studioにはこれを行うためのGUIがありませんが、csprojファイルを正しく編集すれば、その設定が受け入れられます。
ティムウィ

3
必要性:using System.Runtime.InteropServices;
アンソニー・ニコルズ

5
これは非常に素晴らしい答えですが、私は追加の1つの以上のオプションがあることを追加される場合がありconst int SW_SHOWMINIMIZED = 2;、その後、ShowWindow(handle, SW_SHOWMINIMIZED); この方法でコンソールを開始するには隠されていない、単に最小化。
KansaiRobot 2016年

265

ただ、アプリケーションのに行くのプロパティと変更出力タイプからコンソールアプリケーションをするWindowsアプリケーション


9
これでOPの質問に答えることはできませんが、この答えを教えてくれて本当に感謝しています。それはまさに私が必要としたものでした:)
kayleeFrye_onDeck 14

6
この方法ではウィンドウを表示できないため、これは解決策ではありません。
のMichałWoliński

6
これは、ポスターが要求したものに対する解決策ではありません。
KansaiRobot 2016年

1
このソリューションは優れていますが、コンソールを表示および非表示にするタイミングをプログラムで制御することはできません。コンソールを非表示にしたい(つまり、サイレントモード、verbose = false)コンソールパラメータを受け入れるとしましょう
TheLegendaryCopyCoder

3
これは、メインの実行可能ファイルをバックグラウンドで更新してから実行する場合に最適です。感謝
エーサン、

22

コンソール自体を非表示にしたいのに、なぜコンソールアプリケーションが必要なのですか。=)

プロジェクトの出力タイプをコンソールアプリケーションではなくWindowsアプリケーションに設定することをお勧めします。コンソールウィンドウは表示されませんが、コンソールアプリケーションのようにすべてのアクションが実行されます。


28
実際に見せたい時が来るかもしれないから。同様に、コンソールアプリケーションは何かを実行しようとし、成功する限り誰も気にしません。そうでない場合は、ポップアップしてCLIを提供します。
ジャニスF

また、サービスとしてTopShelf実行することもできます。これにより問題が解決しますConsoles
Mr Heelis

標準出力をコンソールで使用できるようにする場合は、そのように単純なコンソールが必要です。
トッテカールソン

20

逆にして、アプリケーションの出力タイプをWindowsアプリケーションに設定できます。次に、このコードをアプリケーションの最初に追加します。

[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
}

場合は、このコードは、コンソールが表示されますshowConsoleですtrue


実際、カーソルが点滅しているコンソールが表示されますが、Console.WriteLine( "text")もstandardOutput.WriteLine( "text")も私の場合は何も表示しません。何か不足していますか?
Ronny D'Hoore

9

ここに私の投稿を参照してください:

Windowsアプリケーションでコンソールを表示

Windowsアプリケーション(ウィンドウの有無にかかわらず)を作成し、必要に応じてコンソールを表示できます。この方法を使用すると、明示的に表示しない限り、コンソールウィンドウは表示されません。開いている方法に応じてコンソールモードまたはGUIモードで実行したいデュアルモードアプリケーションに使用します。


優れた!コンソールを非表示にする最も簡単な方法は、プロジェクトタイプをWindowsアプリケーションに変更することです。

4

「隠すだけ」でできること:

出力タイプをコンソールアプリケーションからWindowsアプリケーションに変更するに。

代わりに、最後にをConsole.Readline/key使用new ManualResetEvent(false).WaitOne()してアプリを実行し続けることができます。


1

ウィンドウのタイトルに依存したくない場合は、これを使用します。

    [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());

DllImport( "fullPath")でdllファイルのフルパスを指定する必要があります/
Tushar Gupta-curioustushar 2013年

0

小さなバッチアプリケーションの統合に問題がない場合は、コンソールタイトルに基づいてコンソールウィンドウを非表示にするCmdow.exeと呼ばれるこのプログラムがあります。

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();

exeをソリューションに追加し、ビルドアクションを「コンテンツ」に設定し、[出力ディレクトリにコピー]を適切なものに設定します。実行すると、コンソールウィンドウが非表示になります。

コンソールを再び表示するには、引数を変更するだけです

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.