gpt4 book ai didi

c++ - 将数据传递到 Windows 控制台控制处理程序

转载 作者:可可西里 更新时间:2023-11-01 14:19:30 27 4
gpt4 key购买 nike

我正在编写一个简单的游戏引擎,但在处理 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);

最佳答案

我不确定您为什么需要这个。您可以有多个窗口,但只有一个控制台。

但是,GetConsoleWindow 将为您提供控制台 HWND,您可以在其上调用 SetWindowLongPtr。不是很干净(你不应该在你不管理的窗口上这样做),但它可能会起作用。

关于c++ - 将数据传递到 Windows 控制台控制处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8697650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com