Barry 的屏幕捕获






3.74/5 (26投票s)
2003 年 1 月 12 日
4分钟阅读

282735

14511
关于屏幕捕获方法的文章
引言
本文演示了捕获屏幕不同部分的方法。您可以将捕获的图像保存到文件。
背景
开发这篇文章的灵感来自于我在网上下载的一个用于截屏的工具,用于我撰写此类文章。不幸的是,下载的工具弹出了太多烦人的对话框,而且显然无广告版本需要付费,而我负担不起。所以唯一的出路就是自己开发一个。MSDN 示例代码 WinCap
本可以满足需求,但 CD 上没有提供源代码。因此,我开始使用 MFC 并在 MSDN CD 上的 Win32 示例(WinCap
)的基础上开发这篇文章。同时,为了能够捕获屏幕的某个部分,这在我之前使用 Visual Basic 时已经做过,因为在 Visual Basic 中截屏要容易得多,并且相关代码可以在 Visual Basic 的知识库中找到。
特点
本文具有以下特点:
- 捕获桌面
- 捕获窗口
- 捕获客户区
- 捕获控件(例如:
Button
)
此外,它还具有以下我认为有趣但不太实用的功能:
- 跟踪捕获图像的 X 和 Y 坐标
- 跟踪捕获图像特定点的颜色代码
颜色和位置跟踪的选项在系统的 MainFrame
窗口上,并且只能在捕获图像后使用。
如何使用项目
下载项目源文件,将文件解压缩到某个文件夹,构建项目。如果在构建时没有错误,请执行项目。一个 相机
图标将出现在系统托盘(屏幕底部栏)中。右键单击该图标,将弹出一个菜单,从中选择选项。
弹出菜单
选项 | 执行的任务 |
捕获桌面 | 立即捕获系统桌面的图像 |
捕获窗口 | 提示点击要捕获的窗口 |
捕获客户区 | 提示点击客户区进行捕获 |
捕获控件 | 提示点击控件进行捕获 |
清除图像 | 清除捕获的图像 |
显示窗口 | 显示 CapIT 系统窗口 |
Close | 关闭 CapIT 系统 |
除了弹出菜单外,CapIT 系统还有自己的主菜单,当您从弹出菜单中选择“显示窗口”时可以显示该菜单。
工作原理
在捕获窗口、客户区或控件时,系统会调用 SetCapture()
函数并等待用户点击桌面上的某个窗口进行捕获。点击要捕获的区域后,系统框架会调用成员函数 void CCapITView::OnCaptureChanged(CWnd *pWnd)
,该函数会调用 WindowCapture(HWND hwnd)
,后者会负责捕获图像(直到菜单被禁用)。捕获完成后,系统会调用 ReleaseCapture()
来释放 SetCapture()
。但在捕获桌面时,不会调用 SetCapture()
,而是直接调用 WindowCapture(HWND hwnd)
并将 GetDesktopWindow()->m_hWnd
传递给它,系统会立即捕获桌面图像,因为只有一个桌面区域,并且其 HWND
是 System
已知的。
注意
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
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。