C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 将数据传递到Windows控制台控制处理程序大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个简单的游戏引擎,我无法处理 Windows控制台事件;具体来说,我无法弄清楚如何将自定义数据传递给回调处理程序.

我首先调用代码来指定我的回调函数

SetConsoleCtrlHandler((PHANDLER_RoutINE)WindowsSy@L_295_6@manager::ConsoleControlHandler,truE);

我的静态成员回调函数定义为:

bool WINAPI WindowsSy@L_295_6@manager::ConsoleControlHandler(DWORD controlTypE){
    if(controlType == CTRL_CLOSE_EVENT){
        messageBox(NULL,L"Close Event Captured",null);
    }
    return true;
}

一切正常 – 当我点击控制台中的关闭按钮时,会弹出此messageBox.唯一的问题是,我需要在这种类型的关闭(以及其他清理)中调用将日志缓冲区刷新到日志文件代码,并且Logger实例是我的WindowsSy@L_295_6@manager中的成员.

已经成功通过使用SetWindowLongPtr和GetWindowLongPtr处理了将自定义数据传递给窗口句柄的类似问题,但我找不到有关如何使用控制台控件处理程序执行此类操作的任何信息.有什么想法吗?

编辑:我根据MSalters的建议实现了这项功能.控制台控制处理程序的最终代码在这里

bool WINAPI WindowsSy@L_295_6@manager::ConsoleControlHandler(DWORD controlTypE){
    BerserkENGIne* ENGIne = (BerserkENGIne*)GetWindowLongPtr(GetConsoleWindow(),GWLP_USERDATA);
    if(controlType == CTRL_CLOSE_EVENT){
        ENGIne->~BerserkENGIne();
        PostQuitmessage(0);
    }
    return true;
}

我在WindowsSy@L_295_6@manager构造函数中设置此自定义数据指针的位置:

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

解决方法

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

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

大佬总结

以上是大佬教程为你收集整理的c – 将数据传递到Windows控制台控制处理程序全部内容,希望文章能够帮你解决c – 将数据传递到Windows控制台控制处理程序所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。