,並在使用CIN的情況下,這不是一個可行的解決方案無論如何
這是你的問題的殺手細節。這很簡單,首先調用AttachConsole(ATTACH_PARENT_PROCESS)來嘗試附加到現有的控制檯。當您的程序從資源管理器或桌面快捷方式等GUI程序啓動時,這會失敗。所以如果它返回FALSE,那麼調用AllocConsole()來創建你自己的控制檯。
使用cin是一個問題。命令處理器會關注您的EXE並檢查它是否爲控制檯模式應用程序或GUI應用程序。它會檢測到您的案例中的GUI應用程序,然後不會等待該過程完成。它再次顯示提示並等待輸入。然後你也會等待輸入,但是你會失敗,命令處理器首先到達那裏。您的輸出也與命令提示符混合在一起,這是要解決的簡單問題。
有一個簡單的解決方法,你的用戶應該用start /wait yourapp
開始你的程序,告訴命令處理器等待該過程完成。問題是:沒有人使用過。用戶不會意識到鍵入輸入時會發生什麼情況,而是希望它進入您的程序,但它實際上是由命令處理器解釋的。產生一個神祕的錯誤信息或格式化硬盤驅動器。
只有兩個很好的方法來解決這個無法解決的問題。您可以將您的程序構建爲控制檯模式應用程序,並在您確定要顯示GUI時調用FreeConsole()。或者總是調用AllocConsole()。這些不是很好的選擇。第一種方法是Windows上的Java JVM使用的方法。其中一個針對JVM提出的最老的錯誤,使Java程序員完全從閃爍的控制檯窗口中跳出來。
第三個選擇是唯一的體面的一個,你不想要的,創建另一個總是使用控制檯的EXE。像Java一樣,javaw.exe vs java.exe。
一個詭計是可能的,您可以將該文件從「yourapp2.exe」重命名爲「yourapp.com」。當用戶在命令行提示符下鍵入「yourapp」時,它將被首先選中,桌面快捷方式仍然可以指向「yourapp.exe」。 Visual Studio使用這個技巧,devenv.com vs devenv.exe。
可能重複://計算器.com/questions/447352 /如何知道我們是在一個控制檯還是一個窗口的應用程序) – wallyk 2013-04-11 15:35:47
如果您的應用程序正在運行,您是否只想打印到控制檯?一?你可以使用'cout',如果程序沒有從控制檯啓動,它將被忽略。 – 2013-04-11 15:36:53
@ slavik262我不會在Windows上花太多時間,但是從以前的經驗來看,如果它不是控制檯應用程序,則打印到控制檯時會被忽略。這跟cout,stdout,printf等有關係嗎? – latreides 2013-04-11 15:50:39