Я работаю над написанием простого игрового движка, и у меня возникают проблемы с обработкой событий консоли 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);