[英]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);
}
}
}
老實說,我也需要這個,並且正在尋找答案,並發現了這一點
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.