Is it possible to detect if there is an HDMI device connected using C#?

I think it is possible. you can use the device manager to find out whether a HDMI cable is attached. I had worked on a code to find whether USB is connected and also whether a monitor is connected or not. if u notice any change in the device manager when the HDMI cable is plugged in, you can use that to detect HDMI

I don't think there is a single API (like DirectX) that would allow you to query for that directly. You'd probably need to write some custom routines for ATI/NVidia/etc. cards for that and wrap it into your own mini-API.

I came up with powershell solution:

$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"

This will list no. of connected HDMI cables.
It crawls all displays and count only HDMI from VideoOutputTechnology. HDMI always have 5 value.

Update:1 c# code:

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());

Reason:WmiMonitorConnectionParams array returns number of external displays and their info including VideoOutputTechnology,InstanceName,Active. We need VideoOutputTechnology to check whether value is 5 or not and then count it. D3DKMDT_VOT_HDMI=5 & comment &

Update:2 vbscript code:

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
Wscript.Echo "No. of connected HDMI cables :" & HDMI_Monitors 

Same ideology as explained in c# code. Just for visual basic ,vbscript,VBA,vbs etc. Credits:

Update: 3 C++ code

#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 = 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 = 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))
            VARIANT vtProp;
            hr = pclsObj->Get (L"VideoOutputTechnology", 0, &vtProp, 0, 0); 
            if(vtProp.uintVal == 5)
            VariantClear (&vtProp);
            pclsObj->Release ();
            pclsObj = NULL; 
        std::cout << "Number of connected HDMI cables : " << HDMI_Monitors;
        return 0;           

Credits: here

In a sense you couldn't possibly. They could have a DVI->HDMI connector plugged in so it is plugged in as HDMI but the machine only knows it as DVI, or a hand full of other connection types that can be be dongled (teehee) to HDMI.