【发布时间】:2012-01-31 15:07:03
【问题描述】:
我正在编写一个简单的游戏引擎,但在处理 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;
}
一切正常 - 当我单击控制台中的关闭按钮时,会弹出此 MessageBox。唯一的问题是,我需要在此类关闭(以及其他清理)时调用将日志缓冲区刷新到日志文件的代码,并且 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);
【问题讨论】:
-
您是否使用此功能从程序中的任何位置捕获 CTRL_CLOSE_EVENT ?请参考我现在关注的问题stackoverflow.com/questions/40464545/…
标签: c++ windows console controls handler