就像标题所说,我想知道是否可以确定是否使用C#连接了HDMI设备。
答案 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.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 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