我正在编写一个简单的游戏引擎,我在处理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);
答案 0 :(得分:2)
我不确定你为什么需要这个。您可以拥有多个窗口,但只能有一个控制台。
但是,GetConsoleWindow
会为您提供控制台HWND
,您可以在其上调用SetWindowLongPtr
。不是很干净(你不应该在你不管理的窗户上这样做),但它可能会起作用。