3

我正在开发一个没有类和对象的简单 C++ 控制台应用程序。
是否有任何方法或功能可以防止单击红色 X 按钮时控制台关闭?
我正在使用 Visual Studio C++ Express 2010:一个仅包含 main.cpp 文件的简单控制台应用程序。谢谢你回答我的问题 :) !!

4

5 回答 5

6

这对我有用:

#include "conio.h"
void main()
{
    HWND hwnd = GetConsoleWindow();
    HMENU hmenu = GetSystemMenu(hwnd, FALSE);
    EnableMenuItem(hmenu, SC_CLOSE, MF_GRAYED);
}

当我们这样做时,重新启用按钮:

EnableMenuItem(hmenu, SC_CLOSE, MF_ENABLED);

...并设置窗口的标题:

char consoleTitle[256];
wsprintf(consoleTitle, _T("My little window"));
SetConsoleTitle((LPCTSTR)consoleTitle);

我看到大多数参考文献都使用DeleteMenu而不是EnableMenuItem. 我更喜欢后者,因为您可以获得更多控制权(启用/禁用/灰色等)。有关完整选项,请查看 MSDN控制台功能菜单功能

于 2013-07-25T08:58:55.460 回答
4

您可以使用SetConsoleCtrlHandler来控制控制台窗口。您需要编写一个回调来处理事件(例如CTRL_CLOSE_EVENT)。您也可以使用GetConsoleWindow函数来获取窗口句柄,并处理窗口消息。我已经用以前的方法控制了窗口,不确定是否处理特定的窗口消息(通过窗口句柄)。

请参阅控制台功能

于 2013-04-06T09:10:03.993 回答
1

如果您正在接收窗口的消息,则可以捕获窗口的关闭消息并阻止它关闭。不幸的是,控制台独立于其中运行的程序,您没有那种控制权。

于 2013-04-05T17:31:02.893 回答
1

抱歉,这不是评论,我还没有足够的积分来评论。

您不能只删除表单属性中的按钮吗?

于 2013-04-05T17:26:07.200 回答
0

你总是可以使用信号:

#include <cstdio>
void my_handler(int param) {
  main();
}
int main() {
  signal(SIGABRT, my_handler);
  signal(SIGTERM, my_handler);
  return 0;
}  

您显然应该允许用户选择关闭应用程序,方法是更改​​ my_handler. my_handler 调用 main,因此每当程序关闭时,都会调用 my_handler,因此调用 main。

于 2017-03-01T01:43:28.487 回答