ogre实现游戏截屏

来源:互联网 发布:php论坛源码 编辑:程序博客网 时间:2024/06/06 09:18

游戏截屏是网络游戏中一个常用的功能,这里借助强大的ogre功能介绍如何简单实现截屏功能以及使用简单的线程钩子拦截系统截屏键消息。

一. 实现ogre截屏

查看Ogre::RenderWindow 这个类 有writeContentsToFile和writeContentsToTimestampedFile这两个函数

这两个函数是专门为截屏准备的。在程式里我们只要调用Ogre::RenderWindow::writeContentsToTimestampedFile("PrintScreen//screenshot",".jpg");就可以达到我们截屏的目的了。需要注意的是PrintScreen这个用于保存截屏图片的文件夹要存在, ogre不会自动生成一个新的文件夹.
 二. 使用线程钩子拦截系统截屏按键消息
 主要函数: HHOOK SetWindowsHookEx
 (
    int idHook, // 钩子的类型,即它处理的消息类型
    HOOKPROC lpfn, // 钩子子程的地址指针. 是一个回调函数
    HINSTANCE hMod, // 应用程序实例的句柄.标识包含lpfn所指的子程的DLL.
    DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符.
 );
 关于这个函数网上有很多资料, 上面只是简单介绍一下参数.


 首先声明一个全局变量 HHOOK g_KeyBordHook = NULL;
 接着定义一个回调函数, 用来传给SetWindowsHookEx的第二个参数.
 下面是我这对这个函数的定义:
 LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
 {
    if (code == HC_ACTION)
    {
       switch (wParam)
       {
       case VK_SNAPSHOT:
       {
          mRoot->renderOneFrame();
          Ogre::RenderWindow::writeContentsToTimestampedFile("PrintScreen//screenshot",".jpg");
       }break;

       default:
       {

       }break;
      }
  }
  return  CallNextHookEx(KeyBoardHook, code, wParam, lParam);
 }

系统截屏键PrtScSySRq的虚拟码是VK_SNAPSHOT. 因此在钩子捕获该消息时调用ogre的截屏功能就好了.
关于KeyboardProc这个回调函数参数的解释网上有更详细的说明.
有了这些定义, 实现目标功能只有一步之差了, 那就是填写SetWindowsHookEx的参数.
在这里我是这样填写的:g_KeyBordHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId());

如果使用动态库实现系统钩子第三个参数就要填写相应的实例句柄.

最后一个参数表示使用当前线程的id,这个指令我是在windows消息WM_CREATE里写的, 最后不要忘记释放钩子,
使用的函数是BOOL UnhookWindowsHookEx(HHOOK hhk);在这里应该是:UnhookWindowsHookEx(g_KeyBordHook);
就这样, 一个简单的截屏功能完成了~_~.
注意, 这里虽然实现了截屏的功能, 但是不能屏蔽系统的截屏功能. 如果想要达到这样的目的, 就必需使用系统钩子, 也就是
要把相应的功能函数(在这里是KeyboardProc函数)写成dll, 然后函数最后不要返回CallNextHookEx(KeyBoardHook, code, wParam, lParam);
具体的没实现过, 所以不好贴出来~_~.

有关dll的相关知识可以参考windows核心编程的 第四部分 动态链接库

转载或修改请说明出处: http://blog.csdn.net/howlet2/archive/2009/11/24/4864558.aspx
作者:  howlet
E-Mial: howlet3@126.com

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/howlet2/archive/2009/11/24/4864558.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 澳洲语言班挂了怎么办 英国学位翻译成文学硕士怎么办 没考上好的高中怎么办 毕业证12月发放申请英国怎么办 高二迷茫成绩差怎么办 高二期末考的差怎么办 法国留学签证办不下来怎么办 澳洲留学挂科签证续签怎么办 澳洲旅游签证被拒了怎么办 学校六级不让刷分怎么办 英国留学生怎么办申根签证 挂科太多拿不到学位证怎么办 ucl语言班没过怎么办 西澳大学工程挂科怎么办 澳洲语言班没过怎么办2018 杨浦区对口公立小学太差怎么办 公立小学太差了怎么办 澳大利亚出国留学怎么办-语言课程 学校不给释放信怎么办 重修费交不起钱怎么办 不想用家里的钱怎么办 三本学费太贵怎么办 从日本往中国汇款怎么办 学费钱大一没交怎么办 初中孩子和同学相处不好怎么办 使用假护照出国被发现怎么办 酒店忘记退房了怎么办 语言课申请不上怎么办 学会计的应届生想转行怎么办 上班熬不下去了怎么办 墨大选修挂科怎么办 日本签证年收入没有10w怎么办 做生意的办房贷没有薪资流水怎么办 澳洲医保卡丢了怎么办 澳洲爱他美上火怎么办 学信网学籍在籍没交学费怎么办 宝宝从床上摔下来怎么办 狗没打针被咬了怎么办 狗咬了没破皮没出血怎么办 被宠物狗咬了出血了怎么办 让狗咬了下红了怎么办