65.9K
CodeProject 正在变化。 阅读更多。
Home

Barry 的屏幕捕获

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.74/5 (26投票s)

2003 年 1 月 12 日

4分钟阅读

viewsIcon

282735

downloadIcon

14511

关于屏幕捕获方法的文章

Sample Image - CapIT.jpg

引言

本文演示了捕获屏幕不同部分的方法。您可以将捕获的图像保存到文件。

背景

开发这篇文章的灵感来自于我在网上下载的一个用于截屏的工具,用于我撰写此类文章。不幸的是,下载的工具弹出了太多烦人的对话框,而且显然无广告版本需要付费,而我负担不起。所以唯一的出路就是自己开发一个。MSDN 示例代码 WinCap 本可以满足需求,但 CD 上没有提供源代码。因此,我开始使用 MFC 并在 MSDN CD 上的 Win32 示例(WinCap)的基础上开发这篇文章。同时,为了能够捕获屏幕的某个部分,这在我之前使用 Visual Basic 时已经做过,因为在 Visual Basic 中截屏要容易得多,并且相关代码可以在 Visual Basic 的知识库中找到。

特点

本文具有以下特点:

  • 捕获桌面
  • 捕获窗口
  • 捕获客户区
  • 捕获控件(例如:Button

此外,它还具有以下我认为有趣但不太实用的功能:

  • 跟踪捕获图像的 X 和 Y 坐标
  • 跟踪捕获图像特定点的颜色代码

颜色和位置跟踪的选项在系统的 MainFrame 窗口上,并且只能在捕获图像后使用。

如何使用项目

下载项目源文件,将文件解压缩到某个文件夹,构建项目。如果在构建时没有错误,请执行项目。一个 相机 图标将出现在系统托盘(屏幕底部栏)中。右键单击该图标,将弹出一个菜单,从中选择选项。

Sample Image

弹出菜单

选项 执行的任务
捕获桌面 立即捕获系统桌面的图像
捕获窗口 提示点击要捕获的窗口
捕获客户区 提示点击客户区进行捕获
捕获控件 提示点击控件进行捕获
清除图像 清除捕获的图像
显示窗口 显示 CapIT 系统窗口
Close 关闭 CapIT 系统

除了弹出菜单外,CapIT 系统还有自己的主菜单,当您从弹出菜单中选择“显示窗口”时可以显示该菜单。

工作原理

在捕获窗口、客户区或控件时,系统会调用 SetCapture() 函数并等待用户点击桌面上的某个窗口进行捕获。点击要捕获的区域后,系统框架会调用成员函数 void CCapITView::OnCaptureChanged(CWnd *pWnd),该函数会调用 WindowCapture(HWND hwnd),后者会负责捕获图像(直到菜单被禁用)。捕获完成后,系统会调用 ReleaseCapture() 来释放 SetCapture()。但在捕获桌面时,不会调用 SetCapture(),而是直接调用 WindowCapture(HWND hwnd) 并将 GetDesktopWindow()->m_hWnd 传递给它,系统会立即捕获桌面图像,因为只有一个桌面区域,并且其 HWNDSystem 已知的。

注意

CCapITView 类中的以下成员函数是从 MSDN 示例 WinCap 借用的。我自己能写出来吗?不可能。

  • HBITMAP CopyWindowToBitmap(CWnd* wnd , HWND hWnd, WORD fPrintArea)
  • HBITMAP CopyScreenToBitmap(LPRECT lpRect)
  • BOOL PaintBitmap(HDC hDC, LPRECT lpDCRect, HBITMAP hDDB, LPRECT lpDDBRect, HPALETTE hPal)
  • void DoSize(CWnd* wnd , HBITMAP ghBitmap)
  • void SetupScrollBars(CWnd* wnd , WORD cxBitmap, WORD cyBitmap)
  • void ReallyGetClientRect(CWnd* wnd , LPRECT lpRect)
  • WORD SaveDIB(HDIB hDib, LPSTR lpFileName)
  • WORD PaletteSize (VOID FAR * pv)
  • WORD DibNumColors (VOID FAR * pv)
  • HDIB ChangeBitmapFormat(HBITMAP hBitmap, WORD wBitCount, WORD dwCompression, HPALETTE hPal, HWND hwnd)
  • HANDLE AllocRoomForDIB(BITMAPINFOHEADER bi, HBITMAP hBitmap , HWND hwnd)
  • HPALETTE GetSystemPalette(HWND hwnd)
  • int PalEntriesOnDevice(HDC hDC)

已知问题

在 Windows 98 下保存的图像颜色与捕获的图像颜色不完全一致,但我认为在 Windows 2000 下基本一致。

关注点

该项目使用 CScrollView 而不是 CView,因为如果捕获的图像尺寸很大(例如桌面),则在框架窗口中可能无法捕获整个图像,因为 CView 会根据 CView 的客户区大小进行捕获。

历史

  • 版本 1

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.