Windows桌面采集技术

一. 前言

        众所周知,屏幕共享是实时音视频互动中十分重要的一项功能,能够帮助参会者访问另一台计算机或桌面的内容,从而实现文档、图片、多媒体等的实时共享。而在实现屏幕共享的过程中,我们就不得不来聊一聊抓屏技术。Windows系统上有很多抓屏技术,不同的抓屏技术又局限于Windows系统版本,没有一种通用的抓屏技术可以高效的抓取屏幕图像,其中主要的原因是操作系统的显示驱动模型在从XDDM向WDDDM转变,应用层的API也在从GDI向D3D转变。比较主流的屏幕采集方式有GDI、Mirror driver、DXGI、Magnification、WGC,本文针对这几种方式进行简要介绍。

二. 显示器驱动模式

        Windows 显示驱动程序模型要求图形硬件供应商提供配对的用户模式显示驱动程序和内核模式显示驱动程序。

        Windows 2000 显示驱动程序模型 (XDDM) 是用于 Windows 2000 到 Windows Vista 和 Windows 7 的旧显示/图形驱动程序体系结构。Windows 显示驱动程序模型 (WDDM) 是 Windows Vista (WDDM 1.0) 中引入的图形显示驱动程序体系结构。 从Windows 8 (WDDM 1.2) 开始,需要 WDDM。

(一)XDDM模型

        下图显示了在 Windows 2000 及更高版本上显示所需的组件。

        上图中的阴影元素表示随 Windows 2000 及更高版本一起提供的服务。 无阴影元素指示需要第三方显示驱动程序和视频微型端口驱动程序,以便图形适配器在 Windows 2000 及更高版本中显示。

        对于可与基于 NT 的操作系统一起使用的每种类型的图形卡,必须同时具有显示驱动程序和相应的视频微型端口驱动程序。 微型端口驱动程序专为一个图形适配器 (或适配器系列) 编写。 可以为共享公共绘图接口的任意数量的适配器编写显示驱动程序;例如,VGA 显示驱动程序可与 VGA 或 ET4000 微型端口驱动程序一起使用。 这是因为显示驱动程序会绘制,而微型端口驱动程序执行模式设置等操作,并将有关硬件的信息提供给驱动程序。 也可以让多个显示驱动程序与特定的微型端口驱动程序一起使用;例如,16 色和 256 色 SVGA 显示驱动程序可以使用同一微型端口驱动程序。

(二)XDDM模型

        WDDM 显示驱动程序模型体系结构由用户模式和内核模式部分组成。 下图显示了支持 WDDM 所需的体系结构。

        图形硬件供应商必须提供用户模式显示驱动程序和显示微型端口驱动程序 (也称为内核模式显示驱动程序或 KMD) 。

  • 用户模式显示驱动程序是 Direct3D 运行时加载 (DLL) 的动态链接库。

  • 显示微型端口驱动程序与 DirectX 图形内核子系统通信。

  • 核心模块是D3D,同时还兼容了GDI。

三. 桌面采集技术简介

(一) GDI:第一代桌面采集

        Windows 图形设备接口(GDI)是为与设备无关的图形设计的。基于 Windows 的应用程序不能直接访问图形硬件,应用程序通过 GDI 来与设备驱动程序进行交互。GDI 截图就是通过屏幕的DC获取到当前屏幕的位图数据。

  • 特点:不受windows版本限制,基本兼容各版本的系统。

  • 缺点:使用CPU,消耗大量cpu运算时间,性能低,帧率低。

代码实现主流程:

// 获取桌面设备上下文
    HDC hdcScreen = GetDC(nullptr);

    // 获取桌面宽度和高度
    int screenWidth = GetSystemMetrics(SM_CXSCREEN);
    int screenHeight = GetSys
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
WPF是Windows Presentation Foundation的缩写,是一种用于开发Windows桌面应用程序的技术。ModbusTCP是一种常见的通信协议,用于在不同设备之间进行数据交换和通信。采集多个设备意味着我们需要通过ModbusTCP协议从多个设备中收集数据。 在WPF中进行ModbusTCP采集多个设备的过程可以分为以下几个步骤: 1. 首先,我们需要在WPF应用程序中集成ModbusTCP通信的库文件。这些库文件可以提供与ModbusTCP设备通信的必要函数和方法。 2. 接下来,我们需要在WPF应用程序的代码中实现ModbusTCP通信功能。这包括建立与设备的连接,发送请求并接收响应等操作。我们可以使用C#编程语言来编写这些功能代码。 3. 为了实现对多个设备的采集,我们需要在WPF应用程序中管理多个设备的连接和数据交换。这可以通过创建设备对象、为每个设备分配唯一的标识符和管理设备之间的数据交换来实现。 4. 最后,我们需要在WPF应用程序的界面中展示从多个设备采集到的数据。这可以通过在界面上显示设备的状态信息、数据值等来实现。我们可以使用WPF中的控件和数据绑定功能来实现这一点。 总之,通过在WPF中集成ModbusTCP通信库,编写通信功能代码,管理多个设备的连接和数据交换,以及在界面上展示采集到的数据,我们可以实现在WPF应用程序中采集多个设备的功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值