Transmission de données au gestionnaire de contrôle de la console Windows

Je travaille sur l’écriture d’un moteur de jeu simple et j’ai du mal à gérer les événements de la console Windows; Plus précisément, je ne peux pas comprendre comment transmettre des données personnalisées au gestionnaire de rappel.

J’appelle d’abord ce code pour spécifier ma fonction de rappel:

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

Ma fonction de rappel de membre statique est définie comme suit:

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

Tout fonctionne bien – lorsque je clique sur le bouton de fermeture de la console, ce MessageBox apparaît. Le seul problème est que je dois appeler du code qui vide un tampon de journalisation dans un fichier journal sur ce type d’arrêt (ainsi que sur d’autres nettoyages), et l’instance de journalisation est membre de mon WindowsSystemManager.

J’ai traité un problème similaire de transmission de données personnalisées à des descripteurs de fenêtre en utilisant SetWindowLongPtr et GetWindowLongPtr avec succès, mais je ne trouve aucune information sur la façon de faire ce type de chose avec les gestionnaires de contrôle de console. Des pensées?

EDIT: Cette fonctionnalité a fonctionné en fonction des suggestions de MSalters. Le code final du gestionnaire de contrôle de la console est ici:

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

Où je définis ce pointeur de données personnalisé dans le constructeur WindowsSystemManager:

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

Je ne sais pas pourquoi vous en avez besoin. Vous pouvez avoir plusieurs fenêtres, mais une seule console.

Cependant, GetConsoleWindow vous donnera la console HWND sur laquelle vous pouvez appeler SetWindowLongPtr . Pas très propre (vous n’êtes pas censé faire cela sur des fenêtres que vous ne gérez pas), mais cela pourrait fonctionner.