我想以这种方式更改WinForms应用程序,因此如果使用命令行参数调用它,它将在没有UI的情况下运行控制台输出。因此,我将应用程序类型更改为“控制台应用程序”,并编写了类似的内容:
my code snippet:
....
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
[STAThread]
static void Main(string[] args)
{
if (args.Length == 0)
{
FreeConsole();
Application.Run(new MyForm());
}
else
Console.WriteLine("Console party");
.....
在VS的调试模式下,我可以看到DOS框弹出并隐藏。如果我通过控制台这样做,命令行将保持附加到进程,并且在我关闭MyForm窗口之前没有响应。使用参数调用应用程序,可以启动“控制台方”。
FreeConsole的返回值为true,GetLastError没有告诉任何错误代码。
有人知道如何从cmd.exe进程中分离进程吗?
答案 0 :(得分:0)
与同事进行头脑风暴会让我尝试另一种方式。我已将应用程序类型设置回Windows应用程序并执行以下操作:
...
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int input);
static void Main(string[] args)
{
if (args.Length == 0)
{
Application.Run(new MyForm());
}
else if (args.Length == 1)
{
AttachConsole(-1);
Console.WriteLine("Console party");
...
现在发生的是,如果我从cmd.exe框运行它,应用程序从父进程获取控制台(stdin,stdou,stderr)并写入它。在没有参数的情况下使用它时,控制台窗口将不会弹出。
我在考虑,有什么更好的方法。让父进程处理stdin,stdout和stderr处理或让应用程序从其父进程中劫持它!?