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
一. 实现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
相关文章推荐
- ogre实现游戏截屏
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 用Ogre MyGUI实现一套完整的游戏界面及实现方法介绍
- [转] DirectX开发的游戏如何使用DirectXTex实现截屏
- 如何实现游戏截屏功能
- 游戏引擎中的多渲染器的设计与实现(1)--OGRE
- 基于OGRE所实现的高层游戏引擎框架(1)
- 基于OGRE所实现的高层游戏引擎框架(2)
- 利用Ogre的渲染到材质技术实现Ogre截屏功能
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 基于OGRE所实现的高层游戏引擎框架(3)
- 用Ogre MyGUI实现一套完整的游戏界面及实现方法介绍
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 利用Ogre的渲染到材质技术实现Ogre截屏功能
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 用Ogre MyGUI实现一套完整的游戏界面及实现方法介绍
- 用Ogre MyGUI实现一套完整的游戏界面及实现方法介绍
- Unity3D 游戏引擎之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法 )
- 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动
- 【黑马程序员】C语言—推箱子游戏实现