コンソールを非表示にしてC#コンソールアプリケーションを実行する方法
-
08-07-2019 - |
質問
コンソールアプリケーションの実行時にコンソールウィンドウを非表示にする方法はありますか?
現在、Windowsプロセスアプリケーションを使用してコンソールプロセスを開始していますが、タスクの実行中にコンソールウィンドウを表示したくありません。
解決
ProcessStartInfo
クラスを使用している場合、ウィンドウスタイルを非表示に設定できます。
System.Diagnostics.ProcessStartInfo start =
new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
他のヒント
コンソールアプリケーションを作成した場合、デフォルトで非表示にできます。
新しいコンソールアプリを作成してから、「出力タイプ」を変更します。 「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も表示されません。
私はあなたが望むものに正確に答えていないことは知っていますが、正しい質問をしているのかどうか疑問に思っています。
どちらを使用しないのですか:
- windowsサービス
- 新しいスレッドを作成し、その上でプロセスを実行します
必要なのはプロセスを実行することだけであれば、より良いオプションのように聞こえます。
これをクラスに追加して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);
上記の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();
共有する一般的なソリューションがあります:
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の設定を単に変更しようとした>プロジェクト>プロパティ>コンソールアプリケーションの代わりにWindowsアプリケーションとして起動するアプリケーション、およびプロジェクトに関する何かが、これが私のコンソールを隠すことを防ぎました-おそらくDSharpPlusが起動時にコンソールを起動することを要求するためです。知りません。理由が何であれ、このクラスを使用すると、コンソールがポップアップした後に簡単に終了できます。
この魔術師が誰かを助けることを願っています。 ;)
書き込みのみ
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;
ここでの他の回答では、「出力タイプ」を変更できると述べていますが、 " Windows Application"の場合、これは Console.In
がNullStreamReaderになるため使用できないことを意味することに注意してください。
Console.Out
および Console.Error
は引き続き正常に機能するようです。