콘솔에 숨겨진 C# 콘솔 애플리케이션을 실행하는 방법
-
08-07-2019 - |
문제
콘솔 애플리케이션을 실행할 때 콘솔 창을 숨길 수있는 방법이 있습니까?
현재 콘솔 프로세스를 시작하기 위해 Windows Forms 응용 프로그램을 사용하고 있지만 작업이 실행중인 동안 콘솔 창이 표시되기를 원하지 않습니다.
해결책
당신이 사용하는 경우 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 Application"으로 변경하십시오. 그게 다야.
당신은 사용할 수 있습니다 프리 콘솔 프로세스에서 콘솔을 분리하려면 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();
.
프로그램을 클릭하여 프로그램을 시작하면 콘솔이 플래시됩니다. 명령 프롬프트에서 실행할 때 실행 직후 명령 프롬프트가 매우 사라집니다.
나는 보이지 않는 과정으로 내 컴퓨터의 배경에서 영원히 실행되는 불화 봇을 위해 이것을합니다. Topshelf가 나를 위해 일하는 것보다 쉬웠습니다. 다른 곳에서 찾은 코드의 도움으로 이것을 작성하기 전에 몇 가지 탑 쉘 튜토리얼이 실패했습니다. ;피
또한 Visual Studio> Project> Properties> 애플리케이션의 설정을 콘솔 응용 프로그램 대신 Windows 응용 프로그램으로 시작하도록 설정을 간단히 변경하려고 시도했으며, 내 프로젝트에 대한 내용이 콘솔을 숨기지 못했습니다. 아마도 DSHARPPLUS가 스타트 업에서 콘솔을 시작해야하기 때문일 수 있습니다. . 모르겠어요. 이유가 무엇이든,이 클래스는 콘솔이 나타나면 콘솔을 쉽게 죽일 수 있습니다.
이 마술사가 누군가를 도와주기를 바랍니다. ;)
그냥 써
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;
여기에서 다른 답변이 말했듯이 "출력 유형"을 "Windows 응용 프로그램"으로 변경할 수는 있지만 이것이 사용할 수 없음을 의미합니다. Console.In
NullStreamReader가 될 것입니다.
Console.Out
그리고 Console.Error
그러나 여전히 잘 작동하는 것 같습니다.