2013-10-09 47 views
0

我有一個基於Windows的應用程序。我讓它工作在GUI ModeConsole Mode。在GUI modeConsole mode中,我通過使用AttachConsole()附加Console以將輸出打印語句顯示到控制檯。現在的挑戰是,當我在console modeCommand prompt中使用它時,我不需要新的控制檯。 從命令提示符假設,我運行它作爲如何將控制檯輸出數據導入命令提示符?

d:\Project path > MyApp.exe consolemode**Enter**

然後它帶來了另一個控制檯,因爲Attachconsole()。現在,當我禁用AttachConsole()時,它不會顯示新的控制檯,也不會在命令提示符中顯示輸出。但我的要求是在commandprompt中顯示輸出,而不是從comamnd提示符執行時顯示新控制檯。

Myapp.cpp 
Winmain() 
{ 
.... 
... 
AttachConsole(); 
cout << "Console Attached \n"; 
// Some more output 
} 

所以,當我PROMT d:\Project path > MyApp.exe consolemode**Enter** 運行從命令myapp.exe它附加一個new console並打印在新的控制檯窗口輸出。現在我的要求是我需要禁用AttachConsole();並希望在命令提示符下看到輸出。

Myapp.cpp 
Winmain() 
{ 
.... 
... 
//AttachConsole(); //Now I an disabling console 
cout << "Console Attached \n"; 
// Some more output 
} 

如果你看看上面的代碼,我已禁用AttachConsole()。現在想要當我這樣做,

d:\Project path > MyApp.exe consolemode**Enter** 輸出將進入comamnd提示。像下面

d:\Project path > MyApp.exe consolemode **Enter** 
Console Attached 
.... 
... 
d:\Project path > 

請幫我

+0

你能否提供一些最小的示例代碼,展示問題? – sukhmel

+0

@idji:我添加了一些輸入,請檢查它 –

+0

我的意思是可以編譯和運行以演示問題的一些代碼。這樣的例子至少會在你的機器上這樣做。 – sukhmel

回答

0

的處理只能有一個控制檯。因此,如果已經存在控制檯,則AllocConsole將失敗,但如果您尚未連接到父進程的控制檯,AttachConsole將會成功。如果從命令提示符運行,您將已經連接到父控制檯,該控制檯將是cmd.exe,並且AttachConsole也將失敗(除非先調用FreeConsole)。如果沒有控制檯(「GUI模式」),則AllocConsole將成功(如果知道具有可連接到控制檯的進程的PID並且您有足夠的訪問權限,則AttachConsole也會成功)。因此,您只需首先嚐試分配,如果失敗,則調用AttachConsole(-1),如果失敗,則調用AllocConsole(或FreeConsole,然後AttachConsole)。注意:如果通過AllocConsole創建控制檯,則不必另外調用AttachConsole(AttachConsole僅用於連接到不同的控制檯,通常是不同進程的控制檯)。

如果您不想在「控制檯模式」下使用cmd.exe控制檯,則可以調用FreeConsole(在通過查看AllocConsole失敗確定已有控制檯之後),則AllocConsole將成功。這個FreeConsole不會影響父進程的控制檯。

如果您希望使用標準輸出函數(例如printf或cout)寫入您使用AllocConsole分配的控制檯,或者在GUI模式下運行時從控制檯讀取scanf,則必須顯式設置標準句柄,如下所示:

freopen("CON", "w", stdout); 
    freopen("CON", "w", stderr); 
    freopen("CON", "r", stdin); 

不久之前,我寫了一篇關於如何做到這一點的博客文章。我意識到這是張貼鏈接,但我認爲你會發現它很有用。您可以下載一個完整的示例應用程序的Visual Studio解決方案:http://www.windowsinspired.com/how-to-add-a-debugging-console-to-a-windows-gui-application/

1

您應該掌握當前正在運行的窗口並處理它,以便不需要allocconsole。你也必須找到光標所在的位置,並指定你的輸出應該寫在那裏。

HANDLE hStdout; 
CONSOLE_SCREEN_BUFFER_INFO csbi; 

void cp(HANDLE hConsole,wchar_t* output) 
{ 


    DWORD cCharsWritten; 
    COORD crCurr; 
    GetConsoleScreenBufferInfo(hStdout, &csbi); 
    crCurr = csbi.dwCursorPosition; 

    std::wstring ss; 
    ss=output; 

    if(!WriteConsoleOutputCharacter(hConsole,  
           ss.c_str(),  
           (DWORD)ss.length(), 
           crCurr,  
           &cCharsWritten)) 
    { 
     return; 
    } 

} 

int main(void) 
{ 

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    GetConsoleScreenBufferInfo(hStdout, &csbi); 

    function(hStdout,L"string"); 
    return 0; 
} 
相關問題