2012-11-12 106 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