独立于平台的方式捕获控制台/终端关闭事件
Platform independent way to catch console/terminal close event
我的问题很简单:
是否可以独立捕获和处理控制台/终端关闭事件平台?
我的问题与这个问题、这个或这个不同。关于这些问题的答案都没有提供独立于平台的方式。那么,有什么办法吗?如果是,那是什么?还是平坦是不可能的?如果是这样,为什么会这样?我的意思是,为什么不可能开发一个可以处理这个问题的库?
编辑:正如@Yakk所问的,我需要它在Windows和Linux上运行,尽可能少的代码重复。如果有帮助,我正在学习基本的网络。我构建了一个简单的聊天应用程序,我需要在其中关闭应用程序时在聊天历史记录文件中添加条目。我已经实现了一种从应用程序内部关闭它的方法。但是,由于用户更有可能单击关闭按钮,因此我需要能够该事件来执行操作。
没有标准的方法可以做到这一点,而且我不知道可用的库,但是自己编写它并不难:
#if defined(_WIN32) || defined(WIN32)
static void (*theHandler)(int);
static BOOL WINAPI winHandler(DWORD ctrlType)
{
theHandler((int)ctrlType);
return TRUE;
}
#endif
void installConsoleHandler(void (*handler)(int))
{
#if defined(_WIN32) || defined(WIN32)
theHandler = handler;
SetConsoleCtrlHandler(&winHandler, TRUE);
#else
/* sigaction, as you find in your links */
#endif
}
如果保留此代码,则以后可能会将其扩展到其他平台:
#if windows
#elif linux || compatible
#elif whatever
#else
#error "not implemented for current platform"
#endif
你会得到一个真正的图书馆...
上面的代码可以在 C 和 C++ 中使用(为此我更喜欢static
而不是匿名命名空间......),因此您可以将其放在 .c 文件中(并将其编译为 C)。要使其再次在C++中工作(按照您的要求),您需要告诉C++编译器它是一个 C 函数(这意味着没有像 C++ 中那样的名称重整,否则将应用该函数,因此在链接期间找不到该函数),因此标头将包含:
#ifdef __cplusplus
extern "C"
{
#endif
void installConsoleHandler(void (*handler)(int));
#ifdef __cplusplus
}
#endif
(当然,你没有要求C,但如果你可以几乎免费获得它(除了extern "C"
的东西),为什么不带上它呢?谁也不知道...
相关文章:
- 如何在linux终端中同时编译和运行c++代码
- C++:将控制台输出存储在宏中更好吗
- 终端不会为C++文件创建.exe文件吗
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- C++控制台应用程序阻止退出
- 如何修复此iFile以将.txt输出到控制台
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 为什么控制台要求输入,即使代码中没有输入
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 用于窗口的 HID 终端
- 控制台输出在 Qt5 中未正确显示
- C++出现控制台错误.我无法识别源代码的问题
- 独立于平台的方式捕获控制台/终端关闭事件
- 如何用C++编写控制台终端
- C++程序,控制台/终端输出。如何实现"updating text"
- 如何创建控制台终端
- 有没有关于用c++编写控制台/终端应用程序的书?