2012-11-12 73 views
2

我有几个问题都与一个Windows应用程序有关,它也作为控制台应用程序运行。控制台输出格式和控制台Alloc

在我的程序入口点,我有确定命令行参数是否被传入的逻辑,如果是,我打电话给AllocConsole()。这工作得不错,但我很好奇,如果有可能不弹出一个新的控制台窗口。所以期望的是用户会从命令窗口调用它,所以我想让应用程序的输出进入用户当前工作的窗口,而不是其他屏幕。此外,通过AllocConsole()弹出的控制台窗口不便于用户使用。例如,如果用户输入了错误的参数,新窗口将会打开,通知用户他们的错误,然后用户必须回到他们原来的窗口来修复错误,然后再次运行该命令。基本上我正在寻找更传统的命令行体验。这是可能的在我的情况?

下一个问题与格式化控制台输出有关。我在这里阅读了几篇关于SO和MSDN的文章,但我似乎无法找到一个好的答案。我目前在做这样的事情:

Console.WriteLine("{0,0}\t\t{1,10}", item.Key, item.Value); 

此作品不够好,但它是完全可能的,在item.Value值将是几行长从而结束几行。我正在寻找一个更传统的'table'布局,其中item.Value的文本仍然包裹行,但被限制在它自己的列中,并且不包裹在item.Key的值下面。这是可能的,如果是的话,最好的方法是什么?

谢谢!

+0

而不是有条件地打开控制台的表单应用程序为什么不只是有一个控制台应用程序有条件地打开窗口? – Servy

+0

虽然这需要对我正在使用的解决方案进行一些重组,但这是一种可能性。 – dparsons

回答

1

我认为AttachConsole是你在找什么。 Pinvoke - AttachConsole包含正确的签名和样本。下面从www.pinvoke.net复制的签名:

[DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool AttachConsole(uint dwProcessId); 

...(!AttachConsole(ATTACH_PARENT_PROCESS)... 
+1

这个臭名昭着的效果很差,cmd.exe的输出与你的混合,这两个程序将争夺控制台输入。顺便说一句,使参数* int *,所以你可以传递-1。 –

+0

@HansPassant,感谢评论 - 在现实生活中从来不需要这个函数......至于int/uint - 匹配native的签名,你仍然可以传递“-1”(即使是本地的也是“不可能的”需要DWORD):'(uint)(0xFFFFFFFF)'即通过将常量定义为PInvoke的版本。 –

+0

@HansPassant你可以解释一下,深入一点,即你的意思是'程序将在控制台输入上争吵? – dparsons