コンソールアプリケーションの実行時にコンソールウィンドウを非表示にする方法はありますか?
現在、Windowsフォームアプリケーションを使用してコンソールプロセスを開始していますが、タスクの実行中にコンソールウィンドウを表示したくありません。
コンソールアプリケーションの実行時にコンソールウィンドウを非表示にする方法はありますか?
現在、Windowsフォームアプリケーションを使用してコンソールプロセスを開始していますが、タスクの実行中にコンソールウィンドウを表示したくありません。
コンソールアプリケーションを作成した場合は、デフォルトで非表示にすることができます。
新しいコンソールアプリを作成してから、[出力タイプ]タイプを[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
プロセスクラスを使用している場合は、次のように記述できます。
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も表示しません。
これをクラスに追加して、DLLファイルをインポートします。
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
const int SW_HIDE = 0;
const int SW_SHOW = 5;
そして、それを非表示にしたい場合は、次のコマンドを使用します。
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
また、コンソールを表示したい場合:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
私はあなたが望むものに正確に答えていないことを知っていますが、あなたが正しい質問をしているのかどうか疑問に思っています。
どちらも使用しないのはなぜですか。
プロセスを実行するだけであれば、これらはより良いオプションのように聞こえます。
Console.In
ここで他の回答が「出力タイプ」を「Windowsアプリケーション」に変更できると言っていますが、これはNullStreamReaderになるため使用できないことを意味することに注意してください。
Console.Out
Console.Error
ただし、それでも正常に機能しているようです。
上記のAdamMarkowitzの回答に基づいて、次のことが私のために機能しました。
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;