ZBLOG

int SendScreen(std::list& lstPacket, CPacket& inPacket) { CImage screen; //GDI HDC hScreen = ::GetDC(NULL); int nBitPerPixel = GetDeviceCaps(hScreen, BITSPIXEL);//24 ARGB8888 32bit RGB888 24bit int nWidth = GetD...

这段代码的目的是捕获当前屏幕的图像,并将其保存到一个数据包列表中,以便后续处理或传输。下面是对每一部分的详细解释:

主要功能

  1. 获取屏幕设备上下文

    1. HDC hScreen = ::GetDC(NULL);
    • 使用 GetDC 函数获取整个屏幕的设备上下文(HDC),以便后续进行绘制操作。
  2. 获取屏幕参数

    1. int nBitPerPixel = GetDeviceCaps(hScreen, BITSPIXEL);
    2. int nWidth = GetDeviceCaps(hScreen, HORZRES);
    3. int nHeight = GetDeviceCaps(hScreen, VERTRES);
    • 获取当前屏幕的色深(每像素位数)、宽度和高度。这些信息在创建图像对象时会用到。
  3. 创建 GDI 图像对象

    1. screen.Create(nWidth, nHeight, nBitPerPixel);
    • 使用 CImage 类创建一个与屏幕大小相同、色深相同的新图像对象。
  4. 抓取屏幕内容

    1. BitBlt(screen.GetDC(), 0, 0, nWidth, nHeight, hScreen, 0, 0, SRCCOPY);
    • 使用 BitBlt 函数从屏幕设备上下文复制图像数据到之前创建的 CImage 对象中,完成对当前显示内容的截图。
  5. 释放设备上下文

    1. ReleaseDC(NULL, hScreen);
    • 在完成屏幕抓取之后,释放获得的设备上下文。
  6. 分配全局内存块

    1. HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, 0);
    2. if (hMem == NULL) return -1;
    • 使用 GlobalAlloc 分配一个全局可移动内存块,用于存放后续生成的图像数据。如果分配失败则返回错误码 -1
  7. 创建流以保存图像数据

    1. IStream* pStream = NULL;
    2. HRESULT ret = CreateStreamOnHGlobal(hMem, TRUE, &pStream);
    3. if (ret == S_OK) {
    4. screen.Save(pStream, Gdiplus::ImageFormatPNG);
    5. ...
    6. }
  8. 保存图像到流

    • 创建成功后,调用 screen.Save() 方法将捕获到的图像以 PNG 格式保存到流中。
  9. 重新定位流指针并锁定内存

    1. LARGE_INTEGER bg = { 0 };
    2. pStream->Seek(bg, STREAM_SEEK_SET, NULL); // 重置流位置到起始点
    3. PBYTE pData = (PBYTE)GlobalLock(hMem); // 锁定内存,以便访问内部数据
    4. SIZE_T nSize = GlobalSize(hMem); // 获取内存大小
  10. 将数据包添加至列表

    1. lstPacket.push_back(CPacket(6, pData, nSize));
    2. GlobalUnlock(hMem); // 解锁全局内存块,确保安全访问。
  11. 释放资源和清理

    1. pStream->Release();
    2. GlobalFree(hMem); // 清理分配的内存。
    3. screen.ReleaseDC(); // 如果还有需要的话,释放 DC。

总结

整体而言,这段代码实现了以下功能:它从计算机当前显示器上抓取屏幕快照,使用 GDI(Graphics Device Interface)处理相关操作,然后将该快照以 PNG 格式保存在全局内存中,并最后通过给定的数据包格式将该快照的信息放入传递的数据包列表中,以供进一步使用。这可以用于远程桌面、截图工具等场景。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22686

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?