ogre实现游戏截屏

 游戏截屏是网络游戏中一个常用的功能,这里借助强大的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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值