Windows应用程序
,并使用AttachConsole(-1)
API,那么如何使Console.WriteLine
写入我启动应用程序的控制台?这对我不起作用。如果有关系的话,我正在使用Windows 7 x64,并且已启用UAC。 升级似乎无法解决问题,使用
start /wait
也是如此。更新
可能会有所帮助的其他背景:
我刚刚发现,如果我转到命令提示符并键入
cmd /c MyProgram.exe
,然后控制台输出就可以工作了。 如果我启动命令提示符,打开一个cmd.exe
子进程,并从该子shell运行程序,则情况也是如此。我还尝试过注销并重新登录,从开始菜单启动的cmd.exe运行(而不是右键单击->命令提示符),以及从a console2 instance运行。 这些都不起作用。
背景
我在其他网站和几个SO答案中阅读到,我可以调用win32 API
AttachConsole
将我的Windows应用程序绑定到运行我的程序的控制台,以便我可以拥有既是“控制台应用程序”又是“Windows应用程序”的东西。例如,这个问题: 在C#/.Net中是否可能将消息记录到cmd.exe中?。
我编写了一堆逻辑使其工作(使用其他几个API),并且我已经使每种情况都能工作(包括重定向,其他人声称不起作用)。 唯一剩下的情况是让
Console.WriteLine
写入我启动程序的控制台。 根据我所读的所有内容,如果我使用AttachConsole
,这应该起作用。
复制
这是一个最小示例 - 请注意,该项目设置为Windows应用程序
:using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
class Program
{
[STAThread]
static void Main(string[] args)
{
if (!AttachConsole(-1))
{
MessageBox.Show(
new Win32Exception(Marshal.GetLastWin32Error())
.ToString()
);
}
Console.WriteLine("Test");
}
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
private static extern bool AttachConsole(int processId);
}
- 当我从命令提示符中运行时,没有出现错误,但是也没有任何控制台输出。这就是问题所在。
- 如果我在应用程序的执行流程中添加额外的消息框,则消息框会显示。我期望这样做,所以一切都好。
- 当我从Visual Studio或通过双击运行它时,会显示一个带有错误的消息框。我期望这样做,所以这里没问题(在我的真实应用程序中将使用
AllocConsole
)。
如果在调用Console.WriteLine
后调用Marshal.GetLastWin32Error
,则会出现错误“System.ComponentModel.Win32Exception (0x80004005):句柄无效”。我怀疑附加到控制台会导致Console.Out
混乱,但我不知道如何解决它。
AttachConsole(-1)
,而且没有任何问题。我将在上班时比较代码,如果有任何差异,我会回复的。@CodeInChoas:如果您将其创建为控制台应用程序,则始终会在后台拥有控制台窗口。通过使用AttachConsole,您可以获得最佳效果-当通过命令行(控制台)打开应用程序时,它将写入控制台流。 - DennisAttachConsole
不允许窗口写入控制台之外,其他都可以。这正是我想要解决的问题。 - Merlyn Morgan-Graham