是否可以检测是否有使用C#连接的HDMI设备?

时间:2010-08-30 13:59:17

标签: c#

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

4 个答案:

答案 0 :(得分:4)

我想出了 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 数组返回外部显示器的数量及其信息,包括 VideoOutputTechnology InstanceName 活动。我们需要 VideoOutputTechnology 来检查值是否为5,然后对其进行计数。 D3DKMDT_VOT_HDMI = 5 积分:docs.microsoft.comcommentwutils.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 Basic vbscript VBA vbs 等。功劳: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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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