C++ 将控制台窗口置于最前面

标签 c++ visual-studio winapi visual-c++

我用 C++ 编写了一个小计时器程序,一旦计时器用完,我希望控制台窗口弹出到 Windows 的前台以显示“完成”消息。我阅读了有关使用“SetForegroundWindow(hwnd)”的信息,当我从 visual studio 运行代码时,它完全符合我的要求,但是当我构建一个版本并从 VS 外部运行 exe 时,控制台窗口不会弹出,而是它在系统托盘中的图标闪烁。任何想法为什么会这样?我已经在 64 位 Windows 7 和 10 上对其进行了测试,两者都做了同样的事情。

最佳答案

在大多数情况下,只要窗口正确恢复,您就可以使用 SetForegroundWindow。有时系统可能会拒绝请求 ( see documentation ),这通常是有充分理由的,您不应尝试覆盖系统。如果 SetForegroundWindow 失败,那么您仍然可以使用备份选项,您可以在任务栏中看到闪烁的按钮来提醒用户。

void show(HWND hwnd)
{
    WINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) };
    GetWindowPlacement(hwnd, &place);
    switch(place.showCmd)
    {
    case SW_SHOWMAXIMIZED:
        ShowWindow(hwnd, SW_SHOWMAXIMIZED);
        break;
    case SW_SHOWMINIMIZED:
        ShowWindow(hwnd, SW_RESTORE);
        break;
    default:
        ShowWindow(hwnd, SW_NORMAL);
        break;
    }
    SetWindowPos(0, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
    SetForegroundWindow(hwnd);
}

int main()
{
    HWND hwnd = GetConsoleWindow();
    ShowWindow(hwnd, SW_SHOWMINIMIZED);
    //Test: manually click another window, to bring that other window on top
    Sleep(5000);

    //this window should restore itself
    show(hwnd);
    system("pause");
    return 0;
}

关于C++ 将控制台窗口置于最前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351897/

相关文章:

c++ - 使用指针循环数组

c++ - 堆、栈和数据内存单元的大小

c++ - 链接器问题 VS2015。 LNK2019 和 LNK2001 未解析的外部符号

c - 使用 MoveToEx 和 LineTo 为窗口制作边框

c++ - ImpersonateLoggedOnUser 并启动使用 ocx 的新进程失败

c++ - 将指向派生类的指针强制转换为指向指向基类的指针的引用

c++ - while循环的两个条件。我的错误是什么?

visual-studio - 如何在没有绝对路径的情况下引用 typescript 文件?

.net - 使用 Lutz 反射器查看 IL 代码

c - PEB(进程环境 block )无效的 DllBase 地址