2013-01-14 140 views
0

我想要的:在gui應用程序中進行交互式控制檯/窗口交互

一個應用程序,其中有一個gui窗口和控制檯窗口。窗口可以被點擊,拖動等等。在任何特定時刻,控制檯都可以被選擇,並且輸入一行,將被處理。

什麼我已經有:

的應用程序,分配和重視控制檯本身,然後重定向標準流吧。代碼是:

AllocConsole() ; 
AttachConsole(GetCurrentProcessId()); 
freopen("CONIN$","rb",stdin); // reopen stdin handle as console window input 

freopen("CONOUT$","wb",stdout); // reopen stout handle as console window output 

freopen("CONOUT$","wb",stderr); // reopen stderr handle as console window output 

然後註冊窗口類,創建並顯示一個窗口。輸出到控制檯工作正常,與窗口交互是正確的。

但是,我不能輸入任何東西到控制檯。我可以猜出它:如果我調用類似std :: cin >> my_string的東西,我將能夠輸入一行 - 但與窗口的交互將停止,直到輸入完成。那是對的嗎?我如何使應用程序按照上述方式運行?

更新:

我發現相關的問題:Test if stdin has input for C++ (windows and/or linux)

確定的代碼,是否有控制檯輸入字符被賦予有如下:

bool StdinOpen() { 
    static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD bytes_left; 
    PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL); 
    return bytes_left; 
} 

但是,它返回一些過高的數字,好像控制檯中總是有輸入。

回答

0

我會從初始化bytes_left變量開始,並檢查返回值。

bool StdinOpen() { 
    static HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD bytes_left = 0; 
    if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytes_left, NULL)) 
    return false; 
    return bytes_left != 0; 
} 
+0

哦。似乎很明顯。 – Srv19