' Ritorna la lista delle periferiche di acquisizione disponibili come un dizionario Intero,Moniker ( per indicizzare le periferiche )
Public Function Get_ListOfVideoAcquireHardware() As Dictionary(Of Integer, IMoniker)
' Enumeratore di Moniker di tipo VideoInputDevice
Dim classEnum As IEnumMoniker = Nothing
' La lista che conterrà i moniker. Un Moniker è un oggetto che può essere bindato
' su un'interfaccia.
Dim moniker As IMoniker() = New IMoniker(0) {}
' L'enumeratore di Devices.. questo oggetto può enumerare i devices presenti nella macchina
Dim devEnum As ICreateDevEnum = CType(New CreateDevEnum, ICreateDevEnum)
Dim hr As Integer = 0
' Filtra tutti i video devices presenti nella macchina
hr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, classEnum, 0)
If hr <> 0 Then
Throw New Exception("return code from COM: " & hr)
End If
Marshal.ReleaseComObject(devEnum)
' Scorre la lista dei devices disponibili
Dim MList As ArrayList = New ArrayList
Dim EndOfMoniker As Integer
While True
EndOfMoniker = classEnum.Next(moniker.Length, moniker, IntPtr.Zero)
If EndOfMoniker = 1 Then
Exit While
End If
MList.Add(moniker(0))
End While
' Genera la lista da ritornare
Dim toReturn As Dictionary(Of Integer, IMoniker) = New Dictionary(Of Integer, IMoniker)
Dim it As IMoniker
Dim k As Integer = 0
For Each it In MList
toReturn.Add(k, it)
k += 1
Next it
MList.Clear() : MList = Nothing
it = Nothing
' Puliamo un pò la memoria
Marshal.ReleaseComObject(classEnum)
GC.Collect()
Return toReturn
End Function
' Ritorna la descrizione UMANA delle periferiche di acquisizone disponibili.
' Richiede come parametro una lista di IMoniker. Utilizza l'intefaccia IPropertyBag
Public Function Get_FriendlyListOfVideoAcquireHardware(ByRef IMonikerList As Dictionary(Of Integer, IMoniker)) As Dictionary(Of Integer, String)
Dim IProp As IPropertyBag = Nothing
Dim toReturn As Dictionary(Of Integer, String) = New Dictionary(Of Integer, String)
' Le proprietà che intendiamo leggere
Dim FName As String = Nothing
Dim it As KeyValuePair(Of Integer, IMoniker)
For Each it In IMonikerList
it.Value.BindToStorage(Nothing, Nothing, GetType(IPropertyBag).GUID, IProp)
' Legge il nome UMANO della periferica!!!
IProp.Read("FriendlyName", FName, Nothing)
toReturn.Add(it.Key, FName)
Next it
Marshal.ReleaseComObject(IProp)
Return toReturn
End Function
End Class
Se abbiamo una cam installata possiamo provare la bontà del codice in una form
' Istanziamo la nostra classe
Dim myB As Base_VideoUtilty = New Base_VideoUtilty()
' Leggiamo la lista delle periferiche e ne estraiamo il nome umano
Dim t As Dictionary(Of Integer, String) = myB.Get_FriendlyListOfVideoAcquireHardware(myB.Get_ListOfVideoAcquireHardware())
' scorriamo la lista delle periferiche e la aggiungiamo ad una listbox
Dim j As KeyValuePair(Of Integer, String)
For Each j In t
listaPeriferiche.Items.Add(j.Key & " " & j.Value)
Next j
Nel prossimo post vedremo come scrivere una funzione che prenda il flusso video e lo avvii in un oggetto dotato di handle (una form, una picture box , una textbox o qualsiasi oggetto generato dalla api CreateWindowEx)