您的位置:首页 > 其它

ogre实现游戏截屏

2009-11-24 15:52 155 查看
游戏截屏是网络游戏中一个常用的功能,这里借助强大的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: