Hiển thị / Ẩn cửa sổ bảng điều khiển của ứng dụng bảng điều khiển C #


191

Tôi loay hoay tìm thông tin về cách ẩn cửa sổ bảng điều khiển của chính mình. Thật đáng ngạc nhiên, các giải pháp duy nhất tôi có thể tìm thấy là các giải pháp hack có liên quan FindWindow()để tìm cửa sổ giao diện điều khiển theo tiêu đề của nó . Tôi đã tìm hiểu sâu hơn một chút về API Windows và thấy rằng có một cách tốt hơn và dễ dàng hơn nhiều, vì vậy tôi muốn đăng nó ở đây để người khác tìm thấy.

Làm thế nào để bạn ẩn (và hiển thị) cửa sổ giao diện điều khiển được liên kết với ứng dụng bảng điều khiển C # của riêng tôi?

Câu trả lời:


265

Đây là cách thực hiện:

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
Cửa sổ vẫn xuất hiện trong giây lát. Tôi đoán không có cách nào xung quanh điều này, trừ khi loại ứng dụng được thay đổi?
Ciaran Gallagher

2
Sẽ thật tốt nếu có một cách xung quanh đó. Bằng cách đó tôi có thể hiển thị bảng điều khiển khi tôi ở chế độ gỡ lỗi, nhưng chỉ chạy chương trình của tôi và thoát (không có cửa sổ) khi tôi ở chế độ chạy bình thường.
Núi lửa

8
@Vaccano: Có thể biến ứng dụng của bạn thành ứng dụng bảng điều khiển ở chế độ Gỡ lỗi chỉ bằng cách chỉnh sửa csprojtệp theo cách thủ công. Visual Studio không có GUI để làm điều này, nhưng nó sẽ tôn trọng cài đặt nếu bạn chỉnh sửa csprojtệp chính xác.
Timwi

3
Cần:using System.Runtime.InteropServices;
Anthony Nichols

5
Đây là một câu trả lời rất hay nhưng tôi có thể thêm một tùy chọn nữa để thêm vào const int SW_SHOWMINIMIZED = 2;ShowWindow(handle, SW_SHOWMINIMIZED); theo cách này, giao diện điều khiển bắt đầu không bị ẩn, chỉ cần thu nhỏ.
KansaiRobot

265

Chỉ cần truy cập Thuộc tính của ứng dụng và thay đổi loại Đầu ra từ Ứng dụng Bảng điều khiển sang Ứng dụng Windows .


9
Mặc dù điều này không trả lời câu hỏi của OP, tôi thực sự đánh giá cao việc bạn đưa ra câu trả lời này. Đó chính xác là những gì tôi cần :)
kayleeFrye_onDeck 17/12/14

6
Đây không phải là giải pháp, bởi vì cách này cửa sổ không thể được hiển thị.
Michał Woliński

6
Đây không phải là một giải pháp cho những gì người đăng yêu cầu.
KansaiRobot

1
Mặc dù tuyệt vời, giải pháp này không cho phép bạn điều khiển theo chương trình khi nào sẽ hiển thị và ẩn bảng điều khiển. Hãy nói rằng bạn chấp nhận tham số bảng điều khiển mà khi đặt bạn muốn ẩn bảng điều khiển của mình (tức là chế độ im lặng, verbose = false)
TheLegendaryCopyCoder

3
Điều này thật tuyệt khi bạn muốn cập nhật tệp thực thi chính của mình trong nền và sau đó chạy nó. cảm ơn
Ehsan

22

Tại sao bạn cần một ứng dụng giao diện điều khiển nếu bạn muốn ẩn chính giao diện điều khiển? =)

Tôi khuyên bạn nên đặt loại Đầu ra dự án cho Ứng dụng Windows thay vì ứng dụng Console. Nó sẽ không hiển thị cho bạn cửa sổ giao diện điều khiển, nhưng thực hiện tất cả các hành động, giống như ứng dụng Console.


28
Bởi vì có lẽ đã đến lúc tôi thực sự muốn thể hiện nó. Giống như, ứng dụng bảng điều khiển cố gắng thực hiện công cụ và không làm phiền bất cứ ai miễn là nó thành công. Nếu không, nó bật lên và cung cấp cho tôi một CLI.
Janis F

cũng TopShelfcho phép bạn chạy Consolesnhư một dịch vụ và điều này phá vỡ điều đó
Mr Heelis

Nếu bạn muốn tiêu chuẩn có sẵn trong một giao diện điều khiển, thì bạn sẽ cần một giao diện điều khiển, đơn giản như vậy.
Totte Karlsson

20

Bạn có thể thực hiện đảo ngược và đặt loại đầu ra Ứng dụng thành: Ứng dụng Windows. Sau đó thêm mã này vào đầu ứng dụng.

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

Mã này sẽ hiển thị Bảng điều khiển nếu showConsoletrue


Nó thực sự hiển thị bảng điều khiển với một con trỏ nhấp nháy, nhưng cả Console.WriteLine ("văn bản") cũng như StandardOutput.WriteLine ("văn bản") không hiển thị bất cứ điều gì trong trường hợp của tôi. Có thiếu thứ gì không?
Ronny D'Hore

9

Xem bài viết của tôi ở đây:

Hiển thị bảng điều khiển trong ứng dụng Windows

Bạn có thể tạo một ứng dụng Windows (có hoặc không có cửa sổ) và hiển thị bảng điều khiển như mong muốn. Sử dụng phương pháp này, cửa sổ giao diện điều khiển không bao giờ xuất hiện trừ khi bạn hiển thị rõ ràng. Tôi sử dụng nó cho các ứng dụng chế độ kép mà tôi muốn chạy ở chế độ console hoặc gui tùy thuộc vào cách chúng được mở.


Thông minh! Cách dễ nhất để ẩn bảng điều khiển là thay đổi loại dự án thành ứng dụng Windows.

4

"Chỉ để ẩn" bạn có thể:

Thay đổi loại đầu ra từ Ứng dụng Console sang Ứng dụng Windows ,

Và thay vì Console.Readline/keybạn có thể sử dụng new ManualResetEvent(false).WaitOne()ở cuối để giữ cho ứng dụng chạy.


1

Nếu bạn không muốn phụ thuộc vào tiêu đề cửa sổ, hãy sử dụng:

    [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());

chúng tôi phải cung cấp đường dẫn đầy đủ của tệp dll trong DLLImport ("fullPath") /
Tushar Gupta - curioustushar

0

Nếu bạn không gặp vấn đề gì khi tích hợp một ứng dụng lô nhỏ, thì có chương trình này có tên Cmdow.exe sẽ cho phép bạn ẩn các cửa sổ giao diện điều khiển dựa trên tiêu đề của giao diện điều khiển.

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();

Thêm exe vào giải pháp, đặt hành động xây dựng thành "Nội dung", đặt Sao chép vào Thư mục đầu ra phù hợp với bạn và cmdow sẽ ẩn cửa sổ giao diện điều khiển khi nó được chạy.

Để làm cho bảng điều khiển hiển thị lại, bạn chỉ cần thay đổi Đối số

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.