簡體   English   中英

可以從控制台運行但不創建窗口的C#應用​​程序

[英]C# application that can be run from console but does not create a window

我想創建一個C#應用程序,當您從控制台窗口運行它時,它的行為類似於控制台應用程序(並且可以將文本輸出到控制台)但是在外部運行時不會創建控制台窗口。 我做了一些研究,通常的建議是創建一個C#控制台應用程序,然后將其項目類型更改為Windows應用程序。 但是,這會阻止從控制台運行時寫入Console.WriteLine消息。

有沒有辦法運行這樣的程序? 我不需要它來接受任何控制台輸入。 也許還有一些其他方法可以用來從控制台運行時顯示文本?

因此所有控制台輸出在提示后都顯示奇怪

使用AttachConsole()在實踐中效果不佳。 命令處理器會查看您的.exe文件並執行兩項不同的操作,具體取決於它是控制台模式應用程序還是GUI應用程序。 如果是控制台模式應用程序,則等待程序退出,然后顯示提示。 如果它是一個GUI應用程序然后它等待,它假定程序將顯示自己的窗口。

發生了什么,它在啟動程序后顯示提示並等待輸入。 您的Console.Write()輸出現在與命令處理器輸出混合 您還會遇到Console.ReadLine()的問題,用戶輸入的第一行是命令處理器,而不是您。 大大困擾用戶。

解決方法是以不同方式啟動您的程序。 你有類型

  start /wait yourapp.exe args...

這使得命令處理器等待程序退出,就像控制台模式應用程序一樣。

這不太實用,你的應用程序的用戶只是不會想到使用start /wait 沒有簡單的解決方法,你需要使用AllocConsole()。 如果這是一個交易破壞者,那么你只需要創建一個控制台應用程序的另一個小EXE項目。 通過命令行啟動GUI應用程序。 如果你給它的名稱與你的GUI exe相同,但給出.com文件擴展名,那么它將始終首先找到。 它看起來像這樣,適用於任何gui應用程序:

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;

class Program {
    static void Main(string[] args) {
        try {
            var path = Assembly.GetExecutingAssembly().Location;
            var dir = Path.GetDirectoryName(path);
            var file = Path.GetFileNameWithoutExtension(path);
            path = Path.Combine(dir, file + ".exe");

            var prc = Process.Start(path, Environment.CommandLine);
            if (args.Length > 0) prc.WaitForExit();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
            Environment.Exit(1);
        }
    }
}

老實說,我也需要這個,並且正在尋找答案,並發現了這一點

在Windows應用程序中顯示控制台

public static void ShowConsoleWindow()
{
    var handle = GetConsoleWindow();

    if (handle == IntPtr.Zero)
    {
        AllocConsole();
    }
    else
    {
        ShowWindow(handle, SW_SHOW);
    }
}

public static void HideConsoleWindow()
{
    var handle = GetConsoleWindow();

    ShowWindow(handle, SW_HIDE);
}

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AllocConsole();

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

對於此線程中建議的所有其他內容,這看起來是一個很好的解決方案。

作為參考,這是我做的。 我做了一個簡單的“無窗口CLI”可執行文件。 我創建了一個新的控制台應用程序,將其更改為Windows應用程序並通過參數傳遞:

static void Main(string[] args)
{
    string programFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string passArguments = string.Join(" ", args.Select(WrapArgument));

    Process.Start(new ProcessStartInfo(Path.Combine(programFolder, "VidCoderCLI.exe"))
    {
        Arguments = passArguments,
        WindowStyle = ProcessWindowStyle.Hidden
    });
}

private static string WrapArgument(string arg)
{
    if (arg.EndsWith(@"\"))
    {
        return "\"" + arg + "\\\"";
    }

    return "\"" + arg + "\"";
}

任何需要在沒有窗口顯示的情況下打電話的東西都會通過那里。 這很好,因為我避免處理輸出重定向和控制台惡作劇。

雖然技術上不是我問的所以我不會接受這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM