我想要做的是在同一個程序中有我的Windows GUI應用程序和一個Windows控制檯應用程序。所以我有我的GUI應用程序出現,但我可以輸出 std::cout
到控制檯窗口。 我會輸出之類的變量值等是否可以與Windows GUI應用程序一起運行Windows控制檯應用程序?
1
A
回答
3
這是可能的話,你必須記住,控制檯鏈接目標是指使用控制檯自動創建的32位應用程序,它們與GUI相同,因此你會發現它是「自動創建的」,所以這意味着你可以手動執行相同的操作。
您可以使用GUI或帶有控制檯的GUI應用程序製作控制檯應用程序,它由您自己決定,我個人使用GUI製作控制檯應用程序,因爲您可以將GUI置入單獨的線程中,即使是確保控制檯始終存在,因此它可以讓您有機會捕捉致命錯誤。
下面是我自己的一個項目剪斷代碼,不正是你想要做什麼,但很相似
if (!AttachConsole(ATTACH_PARENT_PROCESS) ||\
GetLastError()==ERROR_NOT_SUPPORTED ||\
GetLastError()==ERROR_INVALID_HANDLE)
{
if (!AllocConsole())
{
// in this case we failed to alloc a console
// fatal error?
}
}
// at this point you already have a console or you created one
SetConsoleTitle("caption"); // you can set the console caption if you want to
freopen("CON","w",stdout);
SetConsoleOutputCP(CP_UTF8); // also this is needed when you want to use UTF8
AttachConsole是當你要開始CMD.EXE您的應用程序的特殊情況或另一個控制檯應用程序,這意味着它會繼承控制檯,據我所知,你不能有多個控制檯,所以如果你的進程繼承了一個(你已經有一個)你不能分配一個新的控制檯,該函數將失敗沒有什麼會發生。如果你永遠不會在這種情況下運行你的應用程序,你不需要這個部分,所以我認爲這比這更復雜,因爲Visual Studio可以將你的控制檯輸出附加到它的日誌窗口,這意味着它實際上是一個漂亮的調試免費'工具。但我不確定它會不會奏效,從未嘗試過。
AllocConsole可能會失敗,因此您還應該檢查該情況,在該部分之後,您有自己的新控制檯或以某種方式從另一個應用程序繼承,並且這裏是最重要的部分!你必須重新打開stdout,以便系統知道stdout應該進入這個控制檯。
1
請嘗試以下方法生成一個控制檯,把它撿起來早就從別的地方,但不記得誰給信用:
static const WORD MAX_CONSOLE_LINES = 500;
int hConHandle;
long lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
// allocate a console for this app
if(AllocConsole())
{
// set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = MAX_CONSOLE_LINES;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),
coninfo.dwSize);
// redirect unbuffered STDOUT to the console
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
// redirect unbuffered STDIN to the console
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "r");
*stdin = *fp;
setvbuf(stdin, NULL, _IONBF, 0);
// redirect unbuffered STDERR to the console
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stderr = *fp;
setvbuf(stderr, NULL, _IONBF, 0);
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
// point to console as well
std::ios::sync_with_stdio();
}
相關問題
- 1. 從Windows XAML應用程序運行控制檯應用程序
- 2. 是否可以在Windows容器中運行GUI應用程序?
- 3. 使用Windows調度程序運行控制檯應用程序
- 4. 是否可以使用控制檯應用程序運行Windows窗體應用程序?
- 5. 是否可以從Windows服務運行隱藏的控制檯應用程序?
- 6. 是否可以在控制檯窗口中運行Windows應用程序?
- 7. 與控制檯應用程序Windows窗體應用程序
- 8. 是否有可能在Windows控制檯應用程序
- 9. 運行Windows服務作爲一個控制檯應用程序
- 10. 從控制檯應用程序切換到Windows應用程序
- 11. 控制檯應用程序vs dll vs Windows應用程序等
- 12. 將控制檯應用程序轉換爲Windows應用程序
- 13. 控制檯應用程序。 VS Windows應用程序
- 14. 從Windows窗體應用程序C控制檯應用程序#
- 15. 在Windows控制檯應用程序
- 16. C#控制檯和Windows應用程序
- 17. 是否有可能在windows azure上運行windows應用程序
- 18. 是否可以使用PHP編寫Windows控制檯應用程序?
- 19. 是否可以讓PowerShell與控制檯應用程序交互?
- 20. 控制檯應用程序gui for python
- 21. 在運行Windows桌面應用程序時是否可以與控制檯進行交互?
- 22. QShortcut控制檯應用程序(無GUI)
- 23. 從控制檯應用程序到Windows窗體GUI問題
- 24. 如何從Windows Service運行控制檯應用程序?
- 25. 將C#控制檯應用程序作爲Windows服務運行
- 26. 保留了Windows Mobile控制檯應用程序運行
- 27. 在Mac或Windows上運行.NET Core控制檯應用程序
- 28. 從Windows窗體運行控制檯應用程序
- 29. 從其他控制檯應用程序運行控制檯應用程序
- 30. 是否可以爲Windows Phone 8開發控制檯模式應用程序?
什麼包括我需要使用,因爲VC++告訴我,_open_osfhandle和_O_TEXT未聲明 – MisterArch
嘗試io.h&fcntl.h,抱歉關於延遲 – Ylisar