C # 콘솔 응용 프로그램의 콘솔 창 표시 / 숨기기


192

나는 자신의 콘솔 창을 숨기는 방법에 대한 정보를 봤습니다. 놀랍게도, 내가 찾은 유일한 솔루션 은 제목으로FindWindow() 콘솔 창을 찾는 해킹 솔루션이었습니다 . Windows API에 대해 조금 더 깊이 파고 들었고 훨씬 더 쉽고 쉬운 방법이 있다는 것을 알았으므로 다른 사람들이 찾을 수 있도록 여기에 게시하고 싶었습니다.

내 C # 콘솔 응용 프로그램과 관련된 콘솔 창을 어떻게 숨기고 표시합니까?

답변:


268

응용 프로그램의 속성으로 이동 하여 출력 유형콘솔 응용 프로그램 에서 Windows 응용 프로그램 으로 변경하십시오 .


9
이것이 OP의 질문에 대답하지는 않지만이 답변을 주셔서 감사합니다. 그것은 내가 필요한 것입니다 :)
kayleeFrye_onDeck

6
이 방법으로 창을 표시 할 수 없으므로 솔루션이 아닙니다.
Michał Woliński

6
이것은 포스터가 요구 한 것에 대한 해결책이 아닙니다.
KansaiRobot

2
훌륭하지만이 솔루션을 사용하면 콘솔을 표시하고 숨길 때를 프로그래밍 방식으로 제어 할 수 없습니다. 콘솔 매개 변수를 수락하면 콘솔을 숨기려고 할 때 (예 : 자동 모드, verbose = false)
TheLegendaryCopyCoder

3
백그라운드에서 기본 실행 파일을 업데이트 한 다음 실행할 때 유용합니다. 감사
Ehsan

266

방법은 다음과 같습니다.

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;
const int SW_SHOW = 5;

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);

14
창은 여전히 ​​처음에 잠시 나타납니다. 응용 프로그램 유형이 변경되지 않으면이 문제를 해결할 방법이 없다고 생각합니까?
Ciaran Gallagher

2
그 주위에 방법이 있다면 좋을 것입니다. 그렇게하면 디버그 모드에있을 때 콘솔을 표시 할 수 있지만 정상적인 실행 모드에있을 때 프로그램을 실행하고 창없이 종료합니다.
Vaccano

8
@Vaccano : csproj파일을 수동으로 편집해야만 응용 프로그램을 디버그 모드에서 콘솔 응용 프로그램으로 만들 수 있습니다. Visual Studio에는이를위한 GUI가 없지만 csproj파일을 올바르게 편집하면 설정이 적용 됩니다.
Timwi

3
필요 :using System.Runtime.InteropServices;
Anthony Nichols

5
이것은 매우 좋은 대답이지만 추가 할 옵션이 하나 더 추가 된 const int SW_SHOWMINIMIZED = 2;다음 ShowWindow(handle, SW_SHOWMINIMIZED); 콘솔이 숨겨지지 않고 최소화 된 상태로 시작됩니다.
KansaiRobot

22

콘솔 자체를 숨기려면 왜 콘솔 응용 프로그램이 필요합니까? =)

콘솔 응용 프로그램 대신 프로젝트 출력 유형을 Windows 응용 프로그램으로 설정하는 것이 좋습니다 . 콘솔 창은 표시되지 않지만 콘솔 응용 프로그램과 같은 모든 작업을 실행합니다.


28
실제로 보여주고 싶을 때가 올 수 있기 때문입니다. 마찬가지로 콘솔 응용 프로그램은 무언가를 수행하려고 시도하지만 성공하는 한 다른 사람을 방해하지 않습니다. 그렇지 않은 경우 팝업되어 CLI를 제공합니다.
Janis F

또한 TopShelf당신 Consoles은 서비스 로 운영 할 수있게 되며 이것이 깨집니다
Mr Heelis

콘솔에서 표준을 사용할 수있게하려면 간단한 콘솔이 필요합니다.
토트 칼슨

20

반대로 수행하고 응용 프로그램 출력 유형을 Windows 응용 프로그램으로 설정할 수 있습니다. 그런 다음이 코드를 응용 프로그램의 시작 부분에 추가하십시오.

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

이 코드는 콘솔 showConsoletrue


1
실제로 커서가 깜박이는 콘솔을 표시하지만 Console.WriteLine ( "text") 또는 standardOutput.WriteLine ( "text")은 제 경우에는 아무것도 표시하지 않습니다. 빠진 것이 있습니까?
Ronny D' Hoore

9

내 게시물보기 :

Windows 응용 프로그램에서 콘솔 표시

창을 사용하거나 사용하지 않고 Windows 응용 프로그램을 만들고 원하는대로 콘솔을 표시 할 수 있습니다. 이 방법을 사용하면 명시 적으로 표시하지 않으면 콘솔 창이 나타나지 않습니다. 콘솔 또는 GUI 모드에서 실행 방법에 따라 실행하려는 이중 모드 응용 프로그램에 사용합니다.


우수한! 콘솔을 숨기는 가장 쉬운 방법은 프로젝트 유형을 Windows 응용 프로그램으로 변경하는 것입니다.

4

"숨기기 만"할 수있는 작업 :

의 출력 형식 변경 콘솔 응용 프로그램Windows 응용 프로그램 ,

그리고 대신에 앱을 계속 Console.Readline/key사용 new ManualResetEvent(false).WaitOne()하기 위해 사용할 수 있습니다 .


1

창 제목에 의존하지 않으려면 다음을 사용하십시오.

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());

우리는 / 같이 DllImport ( "fullpath에")에서 DLL 파일의 전체 경로를 제공해야
Tushar 굽타 - curioustushar

0

작은 배치 응용 프로그램을 통합하는 데 문제가없는 경우 콘솔 제목을 기반으로 콘솔 창을 숨길 수있는 Cmdow.exe 라는이 프로그램이 있습니다 .

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

솔루션에 exe를 추가하고 빌드 조치를 "컨텐츠"로 설정하고 복사를 출력 디렉토리로 복사를 설정하십시오. cmdow는 콘솔 창이 실행될 때 콘솔 창을 숨 깁니다.

콘솔을 다시 표시하려면 인수를 변경하면됩니다.

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.