コンソールアプリケーションの実行時にコンソールウィンドウを非表示にする方法はありますか?
現在、Windowsフォームアプリケーションを使用してコンソールプロセスを開始していますが、タスクの実行中にコンソールウィンドウを表示したくありません。
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
コンソールアプリケーションを作成した場合は、デフォルトで非表示にできます。
新しいコンソールアプリを作成し、「出力タイプ」タイプを「Windowsアプリケーション」に変更します(プロジェクトプロパティで行います)
プロセスクラスを使用している場合は、次のように記述できます。
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
yourprocess.start();
およびプロセスが非表示になる前
簡単な答えは、次のとおりです。コンソールアプリのプロパティ(プロジェクトのプロパティ)に移動します。[アプリケーション]タブで、[出力タイプ]を[Windowsアプリケーション]に変更します。それで全部です。
FreeConsole APIを使用して、プロセスからコンソールを切り離すことができます。
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(もちろん、これはコンソールアプリケーションのソースコードにアクセスできる場合にのみ適用されます)
出力に興味がある場合は、この関数を使用できます。
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();
}
指定されたコマンドラインプログラムを実行し、終了するまで待機し、出力を文字列として返します。
ユーザー入力を必要としないプログラムを作成している場合は、常にそれをサービスとして作成できます。サービスには、いかなる種類のUIも表示されません。
私はあなたが望むものに正確に答えていないことは知っていますが、あなたが正しい質問をしているのではないかと思っています。
どちらを使用しないのですか:
必要なのはプロセスを実行することだけであれば、それらはより良いオプションのように聞こえます。
上記の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();
これをクラスに追加して、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);
私は共有する一般的なソリューションを持っています:
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が起動時にコンソールを起動することを要求したため。知りません。理由が何であれ、このクラスを使用すると、コンソールがポップアップした後に簡単に終了できます。
この魔術師が誰かを助けることを願っています。 ;)
ここの他の回答では「出力タイプ」を「Windowsアプリケーション」に変更できると述べていますが、これはConsole.In
がNullStreamReaderになるため使用できないことを意味することに注意してください。
ただし、Console.Out
およびConsole.Error
は引き続き正常に機能するようです。
書くだけ
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;