为什么使控制台全屏显示后,Win32控制台光标停止闪烁?

时间:2018-06-20 03:14:42

标签: c++ winapi

我有一个全屏(窗口显示)的Win32控制台。无论何时全屏显示,我都注意到控制台光标停止闪烁。它只是保持空白。我可以用它打字。只是由于某种原因而没有闪烁。

像这样开始...

Console con("My Console"); 
con.setFullScreen(true); 
con.setFontSize(24); 

con.write("Enter your name: ");
std::string name = con.readLine();

我缩小了问题所在的范围是setFullScreen(true)。

这是该功能中使用的代码(特定于全屏显示):

bool Console::setFullScreen(const bool fullScreen, const bool showScrollBarState, 
    const bool hideMouseCursor)
{
    HWND handle = getHandle();
    LONG style;

    if (fullScreen)
    {
        // Set the window style
        style = GetWindowLong(handle, GWL_STYLE);
        style &= ~(WS_BORDER | WS_CAPTION | WS_THICKFRAME);
        SetWindowLong(handle, GWL_STYLE, style);

        // Set the window to full screen (windowed mode)
        if (!ShowWindow(handle, SW_MAXIMIZE))
            return false; 
    } else { //…}

    return true;
}  

我缩小到这一行:

        // Set the window to full screen (windowed mode)
        if (!ShowWindow(handle, SW_MAXIMIZE))
            return false;

如果我取消了这一行,则无边界窗口将显示闪烁的光标。如果我包括这一行,光标将停止闪烁。如果将其设置为SW_NORMAL,它将显示一个无边框控制台,并且光标闪烁。

作为参考,getHandle()具有以下代码:

HWND Console::getHandle()
{
    return GetConsoleWindow();
}

请让我知道。谢谢。

1 个答案:

答案 0 :(得分:2)

正如Eryksun所指出的,这似乎是WinAPI中的错误。

我现在找到的解决方案似乎是使用SW_MINIMIZE调用ShowWindow(),然后使用SW_SHOWMAXIMIZED再次调用它。

例如,

// Set the window to full screen (windowed mode)
ShowWindow(handle, SW_MINIMIZE);
ShowWindow(handle, SW_SHOWMAXIMIZED);

此后,光标再次闪烁。