[抓屏原理.docVIP

  • 4
  • 0
  • 约8.18千字
  • 约 11页
  • 2017-01-07 发布于北京
  • 举报
[抓屏原理

Windows抓屏的各种方法(1) 2007-12-07 23:01 导言 有时候我们需要编程抓取整个屏幕上的内容,下面我将介绍抓屏是如何实现的。典型地,我们可以用GID和DirectX来完成,另外一个选择是Windows Media API,在这篇文章我会逐一加以分析。在每一种方法里,一旦我们把屏幕的内容保存到了程序定义的内存块或bitmap文件里,我们就可以进一步利用它们来生成动画和电影,这个过程你可以参考“从HBitmap创建电影”一文中,以获得更多的帮助。 用GDI函数抓屏 如果我们不太在意抓屏的效率,并且我们想要的只是一个屏幕快照的话,可以考虑使用GDI方式。这种抓屏机制是以“桌面也是一个窗口,桌面也有一个窗口句柄(HWND)”这个简单的常识为基础的,如果我们得到了桌面的设备上下文(DC),就可以利用blit(复制)它的内容到我们创建的DC中。我们可以用GetDeskWindow()得到桌面的窗口句柄,从句柄得到DC也是很容易的。具体的实现步骤为: 1.????????? 通过GetDesktopWindow()函数得到桌面的窗口句柄 2.????????? 用GetDC()取得桌面窗口的DC 3.????????? 创建和屏幕DC兼容的位图和DC(CreateCompatibleBitmap ()和CreateCompatibleDC()),并把这个位图选进该DC(SelectObject()) 4.????????? 当你准备好抓屏时,就复制桌面窗口DC的内容到兼容DC,你就完成的抓屏过程,兼容位图中就是抓屏时刻的屏幕内容 5.????????? 完成后别忘了释放你创建的对象,内存是宝贵的(对别的程序来说) 示例代码: void CaptureScreen() { ??? int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); ??? int nScreenHeight = GetSystemMetrics(SM_CYSCREEN); ??? HWND hDesktopWnd = GetDesktopWindow(); ??? HDC hDesktopDC = GetDC(hDesktopWnd); ??? HDC hCaptureDC = CreateCompatibleDC(hDesktopDC); ??? HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC, ??????? nScreenWidth, nScreenHeight); ??? SelectObject(hCaptureDC,hCaptureBitmap); ??? BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,hDesktopDC,0,0,SRCCOPY); ??? SaveCapturedBitmap(hCaptureBitmap); //Place holder - Put your code ??????????????????????????????? //here to save the captured image to disk ??? ReleaseDC(hDesktopWnd,hDesktopDC); ??? DeleteDC(hCaptureDC); ??? DeleteObject(hCaptureBitmap); } 上面代码段中,GetSystemMetrics()返回屏幕的宽度(SM_CXSCREEN)和高度(SM_CYSCREEN)。关于如何保存抓到的位图到文件和如何置到剪贴板,请参看附带的源代码,很简单的。示例代码每隔一段时间就通过上述技术抓屏,并把图像序列保存到动画。 Windows抓屏的各种方法(2) 2007-12-07 23:03 DirectX方式 用DreictX进行抓屏也是很简单的,DirectX提供了很优雅的实现。 每个DirectX程序都包含一个被我们称作缓冲的内存区域,其中保存了和该程序有关的显存内容,这在程序中被称作后台缓冲(Back Buffer),有些程序有不止一个的后台缓冲。还有一个缓冲,在默认情况下每个程序都可以访问-前台缓冲。前台缓冲保存了和桌面相关的显存内容,实质上就是屏幕图像。 我们的程序通过访问前台缓冲就可以捕捉到当前屏幕的内容。由DirectX的底层优化机制做保证,我们的抓屏效率是很高的,至少比GDI方式高。 在DirectX程序中访问前台缓冲是很简单的,IDirect3DDevi

文档评论(0)

1亿VIP精品文档

相关文档