Передача данных в обработчик консоли Windows - PullRequest
4 голосов
/ 02 января 2012

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

1 Ответ

2 голосов
/ 02 января 2012

Я не уверен, зачем тебе это нужно. У вас может быть несколько окон, но только одна консоль.

Однако, GetConsoleWindow даст вам консоль HWND, на которой вы могли бы позвонить SetWindowLongPtr. Не очень чисто (вы не должны делать это на окнах, которыми вы не управляете), но это может просто сработать.

...