我想用这种方式改变一个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进程中分离进程吗?
与同事进行头脑风暴使我尝试另一种方法。我将应用程序类型设置回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)并向其写入。当不带参数使用它时,控制台窗口将不会弹出。
我在想,什么是更好的方法。让父进程处理标准输入、标准输出和标准错误句柄,还是让应用程序从父进程劫持它!?