将数据传递给Windows控制台控制处理程序

我正在编写一个简单的游戏引擎,并且在处理Windows控制台事件时遇到问题; 具体来说,我不知道如何将自定义数据传递给callback处理程序。

我首先调用这个代码来指定我的callback函数:

SetConsoleCtrlHandler((PHANDLER_ROUTINE)WindowsSystemManager::ConsoleControlHandler, true); 

我的静态成员callback函数被定义为:

 bool WINAPI WindowsSystemManager::ConsoleControlHandler(DWORD controlType){ if(controlType == CTRL_CLOSE_EVENT){ MessageBox(NULL, L"Close Event Captured", L"Close Event Captured", NULL); } return true; } 

一切工作正常 – 当我点击控制台中的closuresbutton,这个消息框popup。 唯一的问题是,我需要调用在这种types的closures(以及其他清理)上将日志缓冲区刷新到日志文件的代码,并且Logger实例是WindowsSystemManager中的成员。

我已经处理了通过成功使用SetWindowLongPtr和GetWindowLongPtr将自定义数据传递给窗口句柄的类似问题,但是我找不到有关如何使用控制台控制处理程序执行此类事情的任何信息。 有什么想法吗?

编辑:我得到这个function基于MSalters的build议工作。 控制台控制处理程序的最终代码如下所示:

 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 。 不是很干净(你不应该这样做,你不能管理的窗口),但它可能只是工作。