【问题标题】:Is it possible to detect if there is an HDMI device connected using C#?是否可以检测是否有使用 C# 连接的 HDMI 设备?
【发布时间】:2010-08-30 13:59:17
【问题描述】:

正如标题所说,我想知道是否可以确定是否使用 C# 连接了 HDMI 设备。

【问题讨论】:

  • 当然可以。如果没有别的,您可以下载执行此操作的应用程序,并从 C# 执行它:) 您可能可以使用一些(不可靠的)注册表项来执行此操作,或者(有些可靠)编组非托管驱动程序或其他此类 api。也可以猜测一下 DirectX api。
  • 用P/Invoke,有办法,但只能从Vista(根据MSDN)或Win7上(根据WinGDI.h目标版本定义):使用WDK/GDI; QueryDisplayConfig 为您提供 DISPLAYCONFIG_PATH_INFO,其中包含 DISPLAYCONFIG_PATH_TARGET_INFO,最后是来自 DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY 的值。由于这是相当复杂和原生的,我认为这不是您正在寻找的答案,但它表明它是可能的......

标签: c#


【解决方案1】:

我想出了 powershell 解决方案:

$HDMI_Monitors = 0;
$wmiobject = (get-wmiobject -namespace root\WMI -computername localhost -Query "Select * from WmiMonitorConnectionParams")
foreach ($letter in $wmiobject)
{
    if($letter["VideoOutputTechnology"] -eq 5) #HDMI cable have value of 5 
    {
        HDMI_Monitors += 1;
    }
}
Write-Host "Number of connected HDMI cables : $HDMI_Monitors"

这将列出没有。连接的 HDMI 电缆
它从 VideoOutputTechnology 抓取所有显示器并仅计算 HDMI。 HDMI 总是有 5 个值。
致谢:here

更新:1 c# 代码:

int HDMI_Monitors = 0;
ManagementClass mClass = new ManagementClass(@"\\localhost\ROOT\WMI:WmiMonitorConnectionParams");
foreach (ManagementObject mObject in mClass.GetInstances())
{
    if (mObject["VideoOutputTechnology"].Equals(5)) //Because D3DKMDT_VOT_HDMI = 5
    {
        HDMI_Monitors += 1;
    }
}
    Console.WriteLine("Number of connected HDMI cables : " + HDMI_Monitors.ToString());

原因:WmiMonitorConnectionParams 数组返回外部显示器的数量及其信息,包括 VideoOutputTechnologyInstanceNameActive。我们需要 VideoOutputTechnology 来检查 value 是否为 5,然后计算它。 D3DKMDT_VOT_HDMI=5 致谢:docs.microsoft.com & comment & wutils.com.

更新:2 vbscript 代码:

Dim HDMI_Monitors 
HDMI_Monitors = 0
For Each Instance In GetObject("WINMGMTS:\\localhost\ROOT\WMI").InstancesOf("WmiMonitorConnectionParams", 1) 
    If Instance.VideoOutputTechnology = 5 Then 
        HDMI_Monitors =  + 1
    End if
Next 
Wscript.Echo "No. of connected HDMI cables :" & HDMI_Monitors 

与 C# 代码中解释的意识形态相同。仅适用于 visual basicvbscriptVBAvbs 等。致谢:wutils.com

更新:3 个 C++ 代码

#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")

int main()
{
    int HDMI_Monitors  = 0;
    IWbemLocator *pLoc = NULL;
    IWbemServices *pSvc = NULL;
    IEnumWbemClassObject *pEnumerator = NULL;
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
    HRESULT hres = NULL;
    
    hres = CoInitializeEx (0, COINIT_MULTITHREADED);
    hres = CoInitializeSecurity (NULL, -1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
    hres = CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,IID_IWbemLocator, (LPVOID *) & pLoc);
    hres = pLoc->ConnectServer (_bstr_t (L"\\\\localhost\\root\\WMI"),NULL,NULL,0,NULL,0,0,&pSvc);
    hres = CoSetProxyBlanket (pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);
    hres = pSvc->ExecQuery (L"WQL", L"SELECT * FROM WmiMonitorConnectionParams",WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
    
        while (pEnumerator)
        {
            HRESULT hr = pEnumerator->Next (WBEM_INFINITE, 1, &pclsObj, &uReturn);
            if (0 == uReturn || FAILED (hr))
            {
              break;
            }
            
            VARIANT vtProp;
            hr = pclsObj->Get (L"VideoOutputTechnology", 0, &vtProp, 0, 0); 
            if(vtProp.uintVal == 5)
            {
                HDMI_Monitors+=1;
            }
            VariantClear (&vtProp);
            pclsObj->Release ();
            pclsObj = NULL; 
        }
        
        std::cout << "Number of connected HDMI cables : " << HDMI_Monitors;
        return 0;           
}

致谢:here

【讨论】:

  • 这只会打印查询返回的项目数。可以检查结果的D3DKMDT_VOT_HDMI 属性以获取每个元素的VideoOutputTechnology,以查看是否有通过HDMI 连接的设备。
  • 这是很好的测试。仅在连接设备时才返回项目数。
  • 连接和断开 HDMI 以查看输出差异。
  • 如果有设备,当然只有一个数字。但是当我通过DVI 连接一台设备和通过DP 连接一台设备时,我仍然得到两台设备(=Array.Length == 2)。所以原始查询不能帮助我识别HDMI 设备。 HDMI 设备的数量只能通过查看 VideoOutputTechnology 属性而不是通过查看数组元素的数量来确定,除非我的答案核心错误(?)。
  • D3DKMDT_VOT_HDMI 的值为 5-2147483648D3DKMDT_VOT_INTERNAL。您可以在 d3dkmdt.h 标头中查找值。
【解决方案2】:

我认为没有一个 API(如 DirectX)可以让您直接查询。您可能需要为 ATI/NVidia/etc 编写一些自定义例程。卡片并将其包装到您自己的迷你 API 中。

【讨论】:

  • DxDiag 没有告诉你这些东西吗?我想知道你是否可以使用 DirectX 来提取 DxDiag 所做的信息,如果这会告诉你。也许不是,这根本不是我的专业领域..
  • 现在查看 DxDiag,我看到“即插即用监视器”,但没有指示接口类型 (VGA/HDMI/DVI)。低级 DirectX 调用可能有可能,但我对此表示怀疑。
  • 由于 MS 为 Vista 和 Win7 更改了显示驱动程序模型,因此 可以使用 Win7 以来的 WDK / GDI。我用链接写了对问题的评论。
【解决方案3】:

从某种意义上说,你不可能。他们可能插入了一个 DVI->HDMI 连接器,因此它作为 HDMI 插入,但机器只知道它是 DVI,或者是一堆其他可以连接到 HDMI 的连接类型。

【讨论】:

    【解决方案4】:

    我认为这是可能的。您可以使用设备管理器查看是否连接了 HDMI 电缆。我编写了一个代码来查找是否连接了 USB 以及是否连接了显示器。如果您在插入 HDMI 电缆时发现设备管理器有任何变化,您可以使用它来检测 HDMI

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2023-03-31
      • 2011-05-31
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多