berserkguard
berserkguard

Reputation: 335

Passing Data to Windows Console Control Handler

I am working on writing a simple game engine and I am having trouble handling Windows console events; specifically, I cannot figure out how to pass custom data to the callback handler.

I first call this code to specify my callback function:

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

My static-member callback function is defined as:

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

Everything works fine - when I click on the close button in the console, this MessageBox pops up. Only problem is, I need to call code that flushes a logging buffer to a log file on this type of shutdown (as well as other clean-up), and the Logger instance is a member in my WindowsSystemManager.

I have dealt with a similar problem of passing custom data to window handles by using SetWindowLongPtr and GetWindowLongPtr successfully, but I can't find any information on how to do this type of thing with console control handlers. Any thoughts?

EDIT: I got this functionality working based on MSalters' suggestions. The final code for the console control handler is here:

bool WINAPI WindowsSystemManager::ConsoleControlHandler(DWORD controlType){
    BerserkEngine* engine = (BerserkEngine*)GetWindowLongPtr(GetConsoleWindow(), GWLP_USERDATA);
    if(controlType == CTRL_CLOSE_EVENT){
        engine->~BerserkEngine();
        PostQuitMessage(0);
    }
    return true;
}

Where I set this custom data pointer in the WindowsSystemManager constructor:

SetWindowLongPtr(GetConsoleWindow(), GWL_USERDATA, (LONG_PTR)this->engine);

Upvotes: 4

Views: 1087

Answers (1)

MSalters
MSalters

Reputation: 180020

I'm not sure why you'd need this. You can have multiple windows, but only one console.

However, GetConsoleWindow will give you the console HWND, on which you might call SetWindowLongPtr. Not very clean (you're not supposed to do this on windows that you don't manage), but it might just work.

Upvotes: 2

Related Questions