No creo que sea la mejor forma de hacerlo... pero
Option Explicit
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal nID As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Const WM_CAP_START As Long = &H400
Private Const WM_CAP_DRIVER_DISCONNECT As Long = (WM_CAP_START + 11)
Private Const WM_CAP_DRIVER_CONNECT As Long = (WM_CAP_START + 10)
Private Sub Form_Load()
Debug.Print IsWebCamPresent
End Sub
Private Function IsWebCamPresent() As Boolean
Dim lRet As Long
lRet = capCreateCaptureWindow(vbNullString, 0, 0, 0, 0, 0, 0, 0)
If Not lRet = 0 Then
If SendMessage(lRet, WM_CAP_DRIVER_CONNECT, ByVal 0&, ByVal 0&) Then
Call SendMessage(lRet, WM_CAP_DRIVER_DISCONNECT, ByVal 0&, ByVal 0&)
IsWebCamPresent = True
End If
Call DestroyWindow(lRet)
End If
End Function