답변:
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 응용 프로그램"(프로젝트 속성에서 완료)으로 변경하십시오.
Process Class를 사용하는 경우 다음을 작성할 수 있습니다.
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
전에 yourprocess.start();
프로세스가 숨겨집니다
콘솔 응용 프로그램의 속성 (프로젝트 속성)으로 이동하십시오. "응용 프로그램"탭에서 "출력 유형"을 "Windows 응용 프로그램"으로 변경하십시오. 그게 다야.
FreeConsole을 사용할 수 있습니다 API를 하여 프로세스에서 콘솔을 분리 .
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(물론 이것은 콘솔 응용 프로그램의 소스 코드에 액세스 할 수있는 경우에만 적용 가능합니다)
FreeConsole
그 이름이 말하는 않습니다, 그것은 호출하기 전에 콘솔을 보여주는에서 Windows를 방지하지 않습니다.
[DllImport("kernel32.dll")] static extern bool AllocConsole();
쉽게 실행할 수 와 표준 Win32 응용 프로그램에서 콘솔
출력에 관심이 있다면이 기능을 사용할 수 있습니다.
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();
}
주어진 명령 행 프로그램을 실행하고 완료 될 때까지 기다렸다가 출력을 문자열로 리턴합니다.
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);
나는 당신이 원하는 것에 정확히 대답하지는 않는다는 것을 알고 있지만, 당신이 올바른 질문을하고 있는지 궁금합니다.
왜 다음 중 하나를 사용하지 않습니까?
원하는 것은 프로세스를 실행하는 것보다 더 나은 옵션처럼 들립니다.
여기의 다른 답변에서 "출력 유형"을 "Windows 응용 프로그램"으로 변경할 수 있다고 말했지만 Console.In
NullStreamReader가되므로 사용할 수 없음을 의미합니다 .
Console.Out
과 Console.Error
그러나 여전히 잘 작동 것 같다.
Console.In
무언가를 입력 할 콘솔이 없을 때 왜 누군가가 사용 합니까? 를 통해 액세스 할 수있는 곳은 어디 Console.In
입니까? 이것은 전혀 의미가 없습니다. 다시 말해 ,이 경우에 Console.In
있어서는 완전히 명백하고 논리적입니다 NullStreamReader
.
위의 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 Bot에 대해이 작업을 수행합니다. TopShelf가 나를 위해 일하는 것보다 쉬웠습니다. 다른 곳에서 찾은 코드의 도움으로 이것을 작성하기 전에 몇 가지 TopShelf 튜토리얼이 실패했습니다. ;피
또한 콘솔 응용 프로그램 대신 Windows 응용 프로그램으로 시작되도록 Visual Studio> 프로젝트> 속성> 응용 프로그램의 설정을 변경하려고 시도했지만 프로젝트에 대한 내 콘솔로 인해 콘솔이 숨겨지지 않습니다. . 모르겠어요 이유가 무엇이든,이 클래스를 사용하면 콘솔이 팝업 된 후 콘솔을 쉽게 죽일 수 있습니다.
이 마술사가 누군가를 돕기를 바랍니다. ;)