c# - 是否可以检测连接到 Windows PC 的显示器是否正在主动显示特定输入?

标签 c# wpf winapi vnc vesa

我正在开发一个支持通过 VNC 进行远程显示的 Windows 应用程序。通常,远程显示器将是唯一的可视界面。但是,在某些情况下,用户会希望使用物理监视器来查看应用程序。如果物理连接的显示器已连接切换到特定输入(可能是 DVI 或 HDMI),我需要能够检测到并关闭 VNC。 是否可以检测连接的显示器是否正在主动显示特定输入?

我知道我可以使用 Screen.AllScreens 获得有关所连接显示器的一些信息但其中似乎没有什么能完全符合我的需要。 Windows API 是否公开了一些方法可以为我提供这些信息?是否可以从 VESA/DDC 确定必要的信息?

最佳答案

我没有任何开发 VNC 应用程序的经验,但也许一个建议可以让您走上正确的道路。

下载wmiexplorer

  1. 运行程序
  2. 在这里您可以浏览 WMI 中的不同类,这是我认为您将获得的最低级别
  3. 转到“查询”选项卡并输入查询:“select * from Win32_DesktopMonitor”

我认为这是您可以用来了解显示器信息的信息。 (我不确定哪些类有与监视器相关的信息)

特别是,查看 Availability对于 Win32_DesktopMonitor 类。

更新

在远程机器 Description 和 DeviceID 和 Name 上运行此查询返回为“Default Monitor”。在我的真实机器上,它以“Generic PnP Monitor”的形式返回,并且有一个 MonitorManufacturer 设置,而远程机器没有。您甚至可以将查询的监视器与 Screen 分辨率或查询中返回的 SystemName 与运行应用程序的计算机的系统名称进行比较。

使用 ManagementObjectSearcher执行 WMI 查询。

编辑

您还可以对设备进行映射/交叉检查,如所示示例 here做。请注意 ClassGUID 在 MonitorDesktop 和 PnPEntity 之间是相同的。

关于c# - 是否可以检测连接到 Windows PC 的显示器是否正在主动显示特定输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21737005/

相关文章:

c - 套接字和 Win32api

c# - 如何在 C# 中将 html 转换为 BBcode

c# - 如何在 C# WinForms 应用程序中设计工作流?

c# - 使用 MVVM 选择 ListView 中的所有项目

winapi - 以编程方式刷新 IconCache.db

c++ - VirtualAllocEx 成功返回一个基地址,但是 WriteProcess 失败,错误是 487

c# - 使用存储过程检索数据

c# - 将数组的一部分复制到列表的快速方法?

c# - 我如何在 C# 中使用 Youtube 直播流 API?

c# - 在代码隐藏中修改列表框的数据模板属性