แสดง / ซ่อนหน้าต่างคอนโซลของแอปพลิเคชันคอนโซล C #


192

ฉันเข้าไปดูข้อมูลเกี่ยวกับวิธีซ่อนหน้าต่างคอนโซลของตัวเอง น่าแปลกที่การแก้ปัญหาเดียวที่ฉันจะพบว่ามีการแก้ปัญหา hacky ที่เกี่ยวข้องกับการFindWindow()ที่จะหาหน้าต่างคอนโซลตามชื่อของมัน ฉันขุดลึกลงไปใน Windows API และพบว่ามีวิธีที่ดีกว่าและง่ายกว่ามากดังนั้นฉันจึงต้องการโพสต์ไว้ที่นี่เพื่อให้คนอื่นค้นพบ

คุณซ่อน (และแสดง) หน้าต่างคอนโซลที่เกี่ยวข้องกับแอปพลิเคชันคอนโซล C # ของฉันเองได้อย่างไร

คำตอบ:


268

เพียงแค่ไปที่แอพลิเคชันของคุณสมบัติและเปลี่ยนประเภทเอาท์พุทจากโปรแกรมประยุกต์ของคอนโซลเพื่อWindows Application


9
แม้ว่าสิ่งนี้จะไม่ตอบคำถามของ OP แต่ฉันขอขอบคุณที่คุณให้คำตอบนี้ มันเป็นสิ่งที่ฉันต้องการ :)
kayleeFrye_onDeck

6
นี่ไม่ใช่วิธีแก้ปัญหาเนื่องจากหน้าต่างนี้ไม่สามารถแสดงได้
MichałWoliński

6
นี่ไม่ใช่ทางออกสำหรับสิ่งที่ผู้โพสต์ถาม
KansaiRobot

2
ในขณะที่ยอดเยี่ยมโซลูชันนี้ไม่อนุญาตให้คุณควบคุมโดยทางโปรแกรมเมื่อต้องแสดงและซ่อนคอนโซล ให้บอกว่าคุณยอมรับคอนโซล param ซึ่งเมื่อตั้งค่าคุณต้องการซ่อนคอนโซลของคุณ (เช่นโหมดเงียบ 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: เป็นไปได้ที่จะทำให้แอปพลิเคชันของคุณเป็นแอปพลิเคชั่นคอนโซลในโหมด Debug โดยแก้ไข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

เหตุใดคุณจึงต้องการแอปพลิเคชันคอนโซลหากคุณต้องการซ่อนคอนโซลเอง =)

ฉันแนะนำให้ตั้งค่า Project Output type เป็นWindows Applicationแทนที่จะเป็นApplication console มันจะไม่แสดงหน้าต่างคอนโซลให้คุณ แต่ดำเนินการทุกการกระทำเช่นเดียวกับแอปพลิเคชันคอนโซล


28
เพราะอาจมีบางครั้งที่ฉันต้องการแสดงมัน เช่นเดียวกับแอปพลิเคชั่นคอนโซลที่พยายามทำสิ่งต่างๆและไม่รบกวนใครเลยตราบใดที่มันประสบความสำเร็จ ถ้าไม่มันปรากฏขึ้นและเสนอ CLI ให้ฉัน
Janis F

ยังTopShelfช่วยให้คุณสามารถทำงานConsolesเป็นบริการและแบ่งนี้
Mr Heelis

หากคุณต้องการให้มีมาตรฐานออกมาในคอนโซลคุณจะต้องใช้คอนโซลแบบง่ายๆ
Totte Karlsson

20

คุณสามารถทำย้อนกลับและตั้งค่าประเภทเอาท์พุทของแอพพลิเคชั่นเป็น: Windows Application จากนั้นเพิ่มรหัสนี้ไปที่จุดเริ่มต้นของแอปพลิเคชัน

[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
}

รหัสนี้จะแสดงคอนโซลถ้าshowConsoleเป็นtrue


1
มันแสดงให้เห็นคอนโซลด้วยเคอร์เซอร์ที่กระพริบ แต่ไม่มี Console.WriteLine ("text") หรือ standardOutput.WriteLine ("text") แสดงอะไรในเคสของฉัน มีบางอย่างขาดหายไปหรือไม่
Ronny D'Hoore

9

ดูโพสต์ของฉันที่นี่:

แสดงคอนโซลในแอปพลิเคชัน Windows

คุณสามารถสร้างแอปพลิเคชัน Windows (มีหรือไม่มีหน้าต่าง) และแสดงคอนโซลตามต้องการ การใช้วิธีนี้หน้าต่างคอนโซลจะไม่ปรากฏเว้นแต่คุณจะแสดงอย่างชัดเจน ฉันใช้สำหรับแอพพลิเคชั่นสองโหมดที่ฉันต้องการเรียกใช้ในโหมดคอนโซลหรือ gui ขึ้นอยู่กับว่าพวกเขาเปิดอยู่


ยอดเยี่ยม วิธีที่ง่ายที่สุดในการซ่อนคอนโซลคือการเปลี่ยนประเภทโครงการเป็นแอปพลิเคชัน Windows

4

"เพื่อซ่อน" คุณสามารถ:

เปลี่ยนประเภทการส่งออกจากโปรแกรมประยุกต์ของคอนโซลเพื่อWindows Application ,

และแทนที่จะเป็น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());

เราต้องให้เส้นทางแบบเต็มของไฟล์ dll ใน DllImport ("fullPath") /
Tushar Gupta - 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.