Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于AttachConsole/Freeconsole API函数_C#_.net_Vb.net_Command Line_Cmd - Fatal编程技术网

C# 关于AttachConsole/Freeconsole API函数

C# 关于AttachConsole/Freeconsole API函数,c#,.net,vb.net,command-line,cmd,C#,.net,Vb.net,Command Line,Cmd,当我将父CMD附加到我的应用程序时,在使用Freeconsole释放附加的CMD后,CMD中有一个空行,我可以在其中写入。。。类似于“@Echo OFF”,当我按“回车”键时,返回回声(@Echo ON) 这是一个VB代码,给出了一个示例: Private Sub Parse_Arguments() AttachConsole(-1) For I As Integer = 0 To My.Application.CommandLineArgs.Count - 1

当我将父CMD附加到我的应用程序时,在使用Freeconsole释放附加的CMD后,CMD中有一个空行,我可以在其中写入。。。类似于“@Echo OFF”,当我按“回车”键时,返回回声(@Echo ON

这是一个VB代码,给出了一个示例:

Private Sub Parse_Arguments()
    AttachConsole(-1)
    For I As Integer = 0 To My.Application.CommandLineArgs.Count - 1
        If My.Application.CommandLineArgs.Item(I) = "/?" Then
            Dim Logo As String = <a><![CDATA[Blah blah blah...]]></a>.Value
            Console.WriteLine(Logo)
            FreeConsole()
            End
        End If
    Next
end sub
这就是我得到的:

C:\>Process.exe
C:\>Text wrote from the process and process finished
c:\>Verbose CMD line, "c:\>" is shown, @Echo is ON, all good!.
C:\>Process.exe
C:\>Text wrote from the process and process finished
Damn empty line where I can write commands, not verbose line, @Echo is OFF.
C:\>Verbose CMD line.

这是一个老问题,但我自己也在努力解决这个问题,所以我想我会发布我的发现

在花了很多时间在这件事上之后,我得出结论,我对它的看法是完全错误的

当前目录在调用可执行文件后立即列出-您的第一个Console.WriteLine()将与此位于同一行

调用
FreeConsole()
后,我们回到控制台。行为空这一事实几乎无关紧要-CMD提示符确实显示了当前目录,但它显示在所有应用程序输出之前。如果想让用户看起来回到“正常”控制台,只需在调用
FreeConsole()
之前输出当前目录即可:


这确实感觉像是一种黑客行为,但随着连接到控制台进程的方式的工作,这可能是您所能做的全部

在您的
FreeConsole()
之后添加
SendKeys.SendWait(“{ENTER}”)
,它将以您想要的方式工作

Console.WriteLine(Logo)
FreeConsole()
SendKeys.SendWait("{ENTER}")

您是否尝试将应用程序的链接目标更改为控制台应用程序?这将为您提供完美的控制台集成,但不会阻止您打开窗口。挑剔:请注意,提示格式并不总是
\u currentdir\u>
。它是由“PROMPT”环境变量的内容决定的(在控制台窗口中时,请参见帮助提示)。因此“正确”模拟它要复杂得多(更不用说从PowerShell或其他Intepreter内部执行时)。@Christian.K-说得好!从Git bash shell运行时,它看起来肯定不对!在我的例子中,这并不重要——这是一个由支持人员在内部使用的程序,我们只是碰巧有一些(年长的)员工喜欢在命令提示符下工作。
Console.WriteLine(Logo)
FreeConsole()
SendKeys.SendWait("{ENTER}")