代码详解
1. 创建 CImage 对象并获取屏幕内容
首先,我们创建一个 对象,用于接收屏幕上的内容。要获取屏幕内容,我们需要先获取当前设备上下文(DC)。调用 函数,参数 表示我们要获取整个屏幕的设备上下文。
讯享网
2. 使用 BitBlt 获取屏幕内容
通过 函数,将当前屏幕的内容复制到 对象上。 的本质就是将源图像的一部分搬运到目标图像的指定位置。
讯享网
3. 释放设备上下文
完成屏幕内容复制后,我们需要释放设备上下文,避免内存泄露。调用 函数来释放资源。
4. 创建全局内存块和流对象
接下来,我们创建一个空的全局内存块,使用 分配内存。 标志表示这块内存是可移动的。然后,我们创建一个 流对象,使用 将全局内存块与流对象绑定。
讯享网
5. 将 CImage 数据保存到流对象
现在,我们可以通过 方法将图像数据保存到流对象中。保存时,我们指定保存的格式(如 JPEG)。
6. 流指针调整
调用 后,流指针已经指向了数据的末尾。如果不重置指针,接下来的读取操作可能会从流的末尾开始,这样读取到的数据可能为空。为了确保后续可以正确读取数据,我们需要通过 函数将流指针重置到开头。
讯享网
7. 锁定内存块并读取数据
接下来,我们通过 锁定全局内存块,获取指向内存的指针。这允许我们直接操作内存中的数据。在操作完数据后,我们使用 解锁内存。

8. 发送数据
使用获取的内存数据,构造数据包并发送。发送完成后,解锁内存。
讯享网
9. 释放资源
最后,我们需要释放流对象、全局内存块以及 对象的设备上下文。资源的释放顺序应该是先释放流对象,再释放全局内存块,最后释放设备上下文。
总结
- 获取屏幕内容:通过 获取设备上下文,使用 将屏幕内容复制到 对象。
- 流操作:使用 创建全局内存块,使用 将内存块和流绑定。使用 保存数据到流对象。
- 内存操作:使用 锁定内存,获取数据后调用 解锁内存。注意流指针位置,要确保数据从流的起始位置读取。
- 资源释放:确保按顺序释放资源:先释放流对象,再释放内存块,最后释放设备上下文。
这样就能确保屏幕截图数据能够被正确保存、读取和发送,同时避免资源泄露。

- 作用:这是标准的 Windows 消息循环,用于处理来自操作系统的消息。
- :从消息队列中检索消息,直到收到退出消息(如关闭窗口)。返回 时退出消息循环。
- :翻译消息,通常是键盘消息,转换为字符消息。
- :分发消息,交给对应的窗口过程进行处理。
- :检查是否是按键按下事件()。
- :判断按下的键是不是 键( 是 键的虚拟键代码)。
- 意识:通过消息循环,程序可以响应用户的输入,处理键盘事件或其他消息。这里实现了用户按 键退出对话框。
这里有个很重要的知识,每个线程都有自己独立的消息循环和消息处理,每个线程发出的消息只能被自己线程的消息循环接收到,所以我们要通过特定的函数来进行跨线程发送消息
PostThreadMessage(threatid, WM_KEYDOWN, 0x1B, 0);
这个函数可以把消息类型消息内容发送给指定的(threatid)线程,这样的话我们就可以把消息发给处理锁机逻辑的线程中,来解锁。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/202305.html