当前位置: 首页 > news >正文

Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(十二)

API 更改

ADS 功能增加了以下公共 API 功能:

  1. 枚举系统中的多路复用器设备。
  2. 查询有关多路复用器的信息,例如,它连接了哪些目标,以及当前切换到哪个目标。
  3. 触发多路复用器切换。
  4. 如何检测多路复用器是否已切换。
枚举系统中的多路复用器设备

应用程序可以使用通用的即插即用 API 来查找代表正常显示多路复用器的设备接口。 用户模式组件可使用Windows.Devices.Enumeration.DeviceInformation。 无论是 C# 还是 C++,都可以使用这些 API 来枚举多路复用器设备。

// Display Mux device interface
// {93c33929-3180-46d3-8aab-008c84ad1e6e}
DEFINE_GUID(GUID_DEVINTERFACE_DISPLAYMUX, 0x93c33929, 0x3180, 0x46d3, 0x8a, 0xab, 0x00, 0x8c, 0x84, 0xad, 0x1e, 0x6e);
IDisplayMuxDevice 接口

添加 IDisplayMuxDevice 接口来表示多路复用器设备。

以下代码演示了如何使用 Windows Runtime API 枚举显示多路复用器设备、查询其状态、切换活动显示目标以及对状态变化做出反应。

#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Devices.Enumeration.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Devices.Display.Core.h>#include <string>
#include <sstream>
#include <iomanip>
#include <windows.h>namespace winrt
{
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Foundation::Collections;
using namespace winrt::Windows::Devices::Enumeration;
using namespace winrt::Windows::Devices::Display;
using namespace winrt::Windows::Devices::Display::Core;
} // namespace winrtvoid SwitchDisplayMuxTarget()
{// PnP device interface search string for Mux device interfacestd::wstring muxDeviceSelector = L"System.Devices.InterfaceClassGuid:=\"{93c33929-3180-46d3-8aab-008c84ad1e6e}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True";// Execute the device interface querywinrt::DeviceInformationCollection deviceInformations = winrt::DeviceInformation::FindAllAsync(muxDeviceSelector, nullptr).get();if (deviceInformations.Size() == 0){printf("No DisplayMux devices\n");return;}printf("%ld display mux devices found\n\n", deviceInformations.Size());// Only one mux in first release but here is generic code for multiplefor (unsigned int i = 0; i < deviceInformations.Size(); i++){printf("Display Mux device %ld :\n", i);// Get the device interface so we can query the infowinrt::DeviceInformation deviceInfo = deviceInformations.GetAt(i);// Get the device idstd::wstring deviceId = deviceInfo.Id().c_str();printf("    Device ID string : %S \n", deviceId.c_str());// Create the DisplayMuxDevice objectauto displayMuxDevice = winrt::DisplayMuxDevice::FromIdAsync(deviceId).get();if (!displayMuxDevice){printf("Failed to create DisplayMuxDevice object");continue;}// Check if DisplayMux is activeauto displayMuxActive = displayMuxDevice.IsActive();printf("    DisplayMux state : %s \n", displayMuxActive ? "Active" : "Inactive");if (!displayMuxActive){continue;}// Register for call back when the state of the DisplayMux changesUINT changeCount = 0;auto token = displayMuxDevice.Changed([&changeCount](auto, auto Args) -> HRESULT {changeCount++;return S_OK;});// Find targets connected to the DisplayMux and the current targetauto targetsList = displayMuxDevice.GetAvailableMuxTargets();winrt::DisplayTarget currentTarget = displayMuxDevice.CurrentTarget();// Switch the display mux to the other target// NOTE SetPreferredTarget() is a sync method so use .get() to wait for the operation to completeprintf("\n");if (currentTarget == targetsList.GetAt(0)){printf("DisplayMux currently connected to first target\n");displayMuxDevice.SetPreferredTarget(targetsList.GetAt(1)).get();printf("Calling SetPreferredTarget to switch DisplayMux to second target\n");}else if (currentTarget == targetsList.GetAt(1)){printf("DisplayMux currently connected to second target\n");displayMuxDevice.SetPreferredTarget(targetsList.GetAt(0)).get();printf("Calling SetPreferredTarget to switch DisplayMux to first target\n");}else{printf("Could not find current target in target list\n");}// Now read the current positioncurrentTarget = displayMuxDevice.CurrentTarget();targetsList = displayMuxDevice.GetAvailableMuxTargets();if (currentTarget == targetsList.GetAt(0)){printf("DisplayMux is now currently connected to first target\n");}else if (currentTarget == targetsList.GetAt(1)){printf("DisplayMux is now currently connected to second target\n");}else{printf("Could not find current target in target list\n");}// Now unregister for change callback and display thedisplayMuxDevice.Changed(token);printf("DisplayMux state change callback was called %ld times\n\n", changeCount);}
}
http://www.lryc.cn/news/544544.html

相关文章:

  • 《当齐天大圣踏入3A游戏世界:黑神话·悟空的破壁传奇》:此文为AI自动生成
  • Graphics View画一个可调速的风机(pyqt)
  • 基于django图书信息管理系统的搭建(增删改查)
  • Python 编程题 第四节:斐波那契数列、列表的复制、暂停后输出、成绩评级、统计字符
  • 【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录
  • 跟我学C++中级篇——定时器的设计
  • HTTP 请求时传递多部分表单数据
  • 第J3-1周:DenseNet算法 实现乳腺癌识别
  • Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)
  • 【解决】OnTriggerEnter/OnTriggerExit 调用匿名委托误区的问题
  • vscode集成DeepSeek
  • MapReduce编程模型
  • SQL server2022的详细安装流程以及简单使用
  • Linux的诞生:一场自由与协作的技术革命
  • Pytorch为什么 nn.CrossEntropyLoss = LogSoftmax + nn.NLLLoss?
  • Go入门之文件
  • 基因型—环境两向表数据分析——品种生态区划分
  • Leetcode2414:最长的字母序连续子字符串的长度
  • React(12)案例前期准备
  • 2025年2月28日(RAG)
  • python-leetcode-寻找重复数
  • Vue 3 中,如果 public 目录下的 .js 文件中有一个函数执行后生成数据,并希望将这些数据传递到组件中
  • ai大模型自动化测试-TensorFlow Testing 测试模型实例
  • 初阶MySQL(两万字全面解析)
  • 数据库数据恢复—SQL Server附加数据库报错“错误 823”怎么办?
  • SpringBatch简单处理多表批量动态更新
  • 夜莺监控 - 边缘告警引擎架构详解
  • 18440二维差分
  • 安全传输,高效共享 —— 体验FileLink的跨网文件传输
  • SOME/IP 教程知识点总结