2011-09-30 89 views
3

我有一個winforms應用程序有時從命令行使用。 這裏是(簡化當然)的代碼:當從cmd運行控制檯和winforms應用程序之間的區別

[STAThread] 
static void Main() 
{ 
    AttachConsole(ATTACH_PARENT_PROCESS); 
    Console.WriteLine("Hello"); 

    /*Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1());*/ 
} 

如果這是一個控制檯應用程序的輸出可以是:

C:\ConsoleApplication\ConsoleApplication.exe 
Hello 
C:\ConsoleApplication\_ 

在窗戶應用其實際的情況下:

C:\WindowsApplication\WindowsApplication.exe 
C:\WindowsApplication\Hello 
_ 

任何人都可以告訴我爲什麼我們有這樣的差異,並有可能使我的Windows應用程序的行爲像從CMD運行時控制檯?

編輯:

我想我的windows應用程序的行爲類似於控制檯從CMD運行時:

C:\WindowsApplication\WindowsApplication.exe 
Hello 
C:\WindowsApplication\_ 

解決方案:

結果我跑我的應用程序as

C:\WindowsApplication\start /wait WindowsApplication.exe 
+2

你想達到什麼目的? –

回答

8

是的。區別在於,cmd.exe知道可執行文件的類型。當它是一個控制檯模式的應用程序時,等待進程終止,它確實是而不是當它是一個常規的Windows GUI應用程序時,等待它自己創建一個窗口,因此它會再次顯示命令提示符,了這一點。您還可以使用Console.ReadLine() BTW有麻煩。

你不得不與start /wait yourapp.exe啓動程序來強制CMD.EXE等待。調用AllocConsole()反而是唯一的通用修復。而且照顧肌酐的當你的應用程序從一個快捷方式開始時,控制檯。

AllocConsole()相當混亂。考慮編寫一個微小的控制檯模式應用程序,它除了Process.Start + WaitForExit之外什麼也不做,以啓動你的主程序。也許還會扼殺命令行參數。現在你可以恢復阻塞行爲了。如果您將可執行文件重命名爲mainapp.com(以啓動mainapp.exe),則差異隱藏得相當好,這也是VS使用的一個技巧(devenv.exe vs devenv.com)。

0

只要正在運行,您希望Windows應用程序阻止控制檯線程,如果我理解正確的話。我不知道你爲什麼要這麼做,但我可以試試它是如何工作的:

將WinForms應用程序更改爲控制檯應用程序,即打開窗體。這樣在顯示窗口時會阻塞控制檯線程。

+0

我這樣做是因爲我已經有一個可以從cmd使用的應用程序(它可以從批處理文件中調用,然後以靜默模式工作)。但是我也支持幫助命令,並且在最後有空行時它看起來不太好 – username

4

在exe中有一個標誌,告訴如果這是一個控制檯應用程序或gui(winform在你的情況下)的應用程序。當你啓動一個應用程序時,如果它是一個控制檯應用程序,Windows將從該程序中分離出控制檯。您可以使用下面的方法來實現你想要的:

  1. 編譯你的GUI應用程序,將其命名爲mytool.exe
  2. 創建一個DOSKEY別名mytool =啓動/等待C:\路徑\ mytool.exe $ *

這樣,當您在資源管理器或快捷方式中啓動mytool.exe時,您將啓動一個正常的Windows應用程序;當你在控制檯輸入mytool的時候,你實際上是通過「start/wait」來啓動它的,它不會把控制檯分成少一點的標誌。 (但是,如果你想從控制檯輸出/輸入東西,你確實需要在你的應用中連接到父控制檯。

+0

謝謝,我希望我可以接受很少的答案 – username

相關問題