web-dev-qa-db-ja.com

コンソールを非表示にしてC#コンソールアプリケーションを実行する方法

コンソールアプリケーションの実行時にコンソールウィンドウを非表示にする方法はありますか?

現在、Windowsフォームアプリケーションを使用してコンソールプロセスを開始していますが、タスクの実行中にコンソールウィンドウを表示したくありません。

134
Aaron Thomas

ProcessStartInfoクラスを使用している場合、ウィンドウスタイルを非表示に設定できます-コンソール(GUIではない)アプリケーションの場合、CreateNoWindowをtrueに設定する必要があります。

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console
151
Adam Markowitz

コンソールアプリケーションを作成した場合は、デフォルトで非表示にできます。

新しいコンソールアプリを作成し、「出力タイプ」タイプを「Windowsアプリケーション」に変更します(プロジェクトプロパティで行います)

187
Simon

プロセスクラスを使用している場合は、次のように記述できます。

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

yourprocess.start();およびプロセスが非表示になる前

67
nld

簡単な答えは、次のとおりです。コンソールアプリのプロパティ(プロジェクトのプロパティ)に移動します。[アプリケーション]タブで、[出力タイプ]を[Windowsアプリケーション]に変更します。それで全部です。

41
Cihan

FreeConsole APIを使用して、プロセスからコンソールを切り離すことができます。

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

(もちろん、これはコンソールアプリケーションのソースコードにアクセスできる場合にのみ適用されます)

20
Thomas Levesque

出力に興味がある場合は、この関数を使用できます。

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

指定されたコマンドラインプログラムを実行し、終了するまで待機し、出力を文字列として返します。

7
JCH2k

ユーザー入力を必要としないプログラムを作成している場合は、常にそれをサービスとして作成できます。サービスには、いかなる種類のUIも表示されません。

4
Chris Bregg

私はあなたが望むものに正確に答えていないことは知っていますが、あなたが正しい質問をしているのではないかと思っています。

どちらを使用しないのですか:

  1. windowsサービス
  2. 新しいスレッドを作成し、その上でプロセスを実行します

必要なのはプロセスを実行することだけであれば、それらはより良いオプションのように聞こえます。

1
Nathan Koop

上記のAdam Markowitzの回答に基づいて、以下は私のために働いた:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();
1
Volcan Baru

これをクラスに追加して、DLLファイルをインポートします。

[DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

そして、それを非表示にする場合は、次のコマンドを使用します。

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);

そして、コンソールを表示したい場合:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
1
IDK anything

私は共有する一般的なソリューションを持っています:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

このクラスをプロジェクトに含めて、Magician.DisappearConsole();を呼び出してください。

プログラムをクリックして起動すると、コンソールが点滅します。コマンドプロンプトから実行すると、コマンドプロンプトは実行後すぐに消えます。

これは、不可視プロセスとしてコンピューターのバックグラウンドで永久に実行されるDiscordボットに対して行います。 TopShelfを機能させるよりも簡単でした。他の場所で見つけたコードの助けを借りてこれを書く前に、いくつかのTopShelfチュートリアルが失敗しました。 ; P

また、Visual Studio> Project> Properties> Applicationの設定を変更して、コンソールアプリケーションではなくWindowsアプリケーションとして起動しようとしましたが、プロジェクトに関する何かがコンソールを隠すことを防ぎました-DSharpPlusが起動時にコンソールを起動することを要求したため。知りません。理由が何であれ、このクラスを使用すると、コンソールがポップアップした後に簡単に終了できます。

この魔術師が誰かを助けることを願っています。 ;)

1
Lucas Jarrett

ここの他の回答では「出力タイプ」を「Windowsアプリケーション」に変更できると述べていますが、これはConsole.InがNullStreamReaderになるため使用できないことを意味することに注意してください。

ただし、Console.OutおよびConsole.Errorは引き続き正常に機能するようです。

0
kjbartel

書くだけ

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;
0
Navin