【问题标题】:C++ bring console window to the frontC++ 将控制台窗口置于最前面
【发布时间】:2018-01-20 01:57:20
【问题描述】:

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

【问题讨论】:

  • 啊!非常感谢,正是该线程上的 alt hack 得到了它,谢谢!
  • 虽然只是作为一种预防措施,但您知道这种 alt hack 是否会产生任何不利影响?就像它模拟按下 alt 键一样,如果用户当时也在按下 f4,那会像他们使用 alt +f4 关闭他们的程序一样,还是 alt 按下仅适用于我的程序?
  • “虽然只是作为预防措施,但您知道 alt hack 是否会产生任何不利影响吗?” -- 确保您的卸载程序工作正常,因为这将是程序中最常用的功能。

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


【解决方案1】:

在大多数情况下,只要窗口正确恢复,您就可以使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2012-10-11
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多