将数据传递给Windows控制台控制处理程序
Passing Data to Windows Console Control Handler
我正在编写一个简单的游戏引擎,我在处理Windows主机事件时遇到了麻烦;具体来说,我不知道如何将自定义数据传递给回调处理程序。
我首先调用这段代码来指定我的回调函数:
SetConsoleCtrlHandler((PHANDLER_ROUTINE)WindowsSystemManager::ConsoleControlHandler, true);
我的静态成员回调函数定义为:
bool WINAPI WindowsSystemManager::ConsoleControlHandler(DWORD controlType){
if(controlType == CTRL_CLOSE_EVENT){
MessageBox(NULL, L"Close Event Captured", L"Close Event Captured", NULL);
}
return true;
}
一切工作正常-当我点击控制台的关闭按钮,这个消息框弹出。唯一的问题是,我需要调用代码,在这种类型的关闭(以及其他清理)上刷新日志缓冲区到日志文件,并且Logger实例是我的WindowsSystemManager中的成员。
我已经处理了一个类似的问题,通过使用SetWindowLongPtr和GetWindowLongPtr成功地传递自定义数据到窗口句柄,但我找不到任何关于如何用控制台控制处理程序做这种类型的事情的信息。任何想法吗?
编辑:我得到了这个功能工作基于MSalters的建议。控制台控制处理程序的最终代码如下:
bool WINAPI WindowsSystemManager::ConsoleControlHandler(DWORD controlType){
BerserkEngine* engine = (BerserkEngine*)GetWindowLongPtr(GetConsoleWindow(), GWLP_USERDATA);
if(controlType == CTRL_CLOSE_EVENT){
engine->~BerserkEngine();
PostQuitMessage(0);
}
return true;
}
我在WindowsSystemManager构造函数中设置了这个自定义数据指针:
SetWindowLongPtr(GetConsoleWindow(), GWL_USERDATA, (LONG_PTR)this->engine);
我不知道你为什么需要这个。你可以有多个窗口,但只能有一个控制台。
然而,GetConsoleWindow
将为您提供控制台HWND
,您可以调用SetWindowLongPtr
。不是很干净(你不应该在你不管理的窗口上这样做),但它可能只是工作。
相关文章:
- C++:将控制台输出存储在宏中更好吗
- 控制允许动态运行c++的并发操作数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 从控制台中删除最后打印的元素
- C++控制台应用程序阻止退出
- 是否可以使用if constexpr删除控制流语句
- 如何修复此iFile以将.txt输出到控制台
- 为什么控制台要求输入,即使代码中没有输入
- 无法在windows控制台中为C++程序提供必要的输入
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 将控制台应用程序直接输出到Visual Studio而不是外部Windows控制台中
- 将控制台输出写入.txt并在控制台上显示
- 我们是否可以使用 FireBase 云消息传递来发送或接收消息,或者在 Windows 桌面/控制台或 Linux 控制
- 如何在 c++ 控制台应用程序中控制光标位置
- Windows 控制台应用在新控制台而不是同一控制台中打开
- QtCreator 2.7.2(Windows)控制台应用程序:如何粘贴到控制台中
- 将数据传递给Windows控制台控制处理程序
- 通过c++控制台提供TCL脚本控制窗口
- 如何完全控制控制台