簡體   English   中英

我可以在Win32 GUI應用程序中使用默認控制台,還是應該創建一個新控制台?

[英]Can I use the default console in a Win32 GUI application, or should I create a new one?

我是Windows API的新手,我正在用C ++編程。 我想有一個控制台,通過GetMessage輸出信息並接收鍵盤命令。 但是,我不能只創建一個控制台應用程序,因為如果我這樣做,就無法讀取使用GetMessage發送到該控制台的鍵盤消息。 通過GetMessage對鍵盤輸入做出反應是該項目的必要條件。

當我在Code :: Blocks 13.12中創建Win32 GUI應用程序(使用MinGW編譯)並在開頭調用AllocConsole時,我收到錯誤5:“訪問被拒絕”。 如果我首先使用FreeConsoleFreeConsole成功而不會出錯; 如果我然后使用AllocConsole ,則會出現一個控制台窗口。 FreeConsole的MSDN描述是:

從其控制台中分離調用進程。

這表明在我調用FreeConsole之前,已經存在一個控制台(即使我看不到它並且沒有明確創建它)。 它是一個不可見的控制台,還是在運行Code :: Blocks項目時總是出現的控制台? 使用FreeConsole然后使用AllocConsole對我來說毫無意義嗎? 是否有一種方法可以使已經存在的控制台可見(如果它不可見)並且能夠通過GetMessage接收鍵盤輸入?

以下是展示此行為的精簡代碼示例:

#include <windows.h>

DWORD dw = 0;

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    if (FreeConsole() == 0) {
        dw = GetLastError();
        return dw;
    }

    if (AllocConsole() == 0) {
        dw = GetLastError();
        return dw;
    }
    return 1;
}

當我在Code :: Blocks中創建Win32 GUI應用程序(使用MinGW進行編譯)並在開頭調用AllocConsole時,我收到錯誤5: 訪問被拒絕

您對AllocConsole的調用失敗的原因是您實際上正在構建一個控制台應用程序。 即使您使用WinMain ,默認情況下,mingw仍會生成一個針對控制台子系統的可執行文件。 您可以使用像dumpbin這樣的工具來檢查PE頭以確認我的結論。

使用-mwindows進行編譯以確保可執行文件以GUI子系統為目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM