web-dev-qa-db-ja.com

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

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

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

163
Timwi

方法は次のとおりです。

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

アプリケーションのPropertiesに移動し、Output typeConsole Applicationto Windows Application.

227
Fahad

コンソール自体を非表示にする場合、なぜコンソールアプリケーションが必要なのですか? =)

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

22
Sasha

逆の操作を行い、アプリケーションの出力タイプを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
}

showConsoletrueの場合、このコードはコンソールを表示します

15
Maiko Kingma

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

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

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

9
Anthony

「非表示にする」ことができます:

出力タイプをConsole ApplicationからWindows Application

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

2
N T

ウィンドウタイトルに依存したくない場合はこれを使用してください:

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

小さなバッチアプリケーションの統合に問題がない場合は、 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をソリューションに追加し、ビルドアクションを「コンテンツ」に設定し、出力ディレクトリにコピーを自分に合ったものに設定すると、cmdowは実行時にコンソールウィンドウを非表示にします。

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

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
0
ScilsOff