Hallo zusammen,
ich möchte in einem VB Programm zwei identische USB Webcams in je einer eigenen PictureBox anzeigen und dann deren Bilder weiterverarbeiten.
Mein Problem ist, dass die Initialisierung der Kameras nicht immer funktioniert. Ich habe die (hoffentlich) relevanten Codeabschnitte unten angehängt. Er besteht aus zwei Teilen.
Deklaration  einer Klasse iCam
(quelle: 
http://www.vbforums.com/showthread.php?344471-Vb.Net-WebCam-Class-%28ICam%29)
Dann das VB-Form, in dem die Anwendung steht. Hier wird zunächst jede Kamera deklariert. Dann wird im Form_Load für beide eine eigene Instanz initialisiert. Später wird dann mit StartCam1 und StartCam2 jede der beiden Kameras gestartet. Hierzu wird der Verweis auf die jeweils der Kamera zugeordneten PictureBox übergeben. Da die beiden PB's auf einem anderen Form namens Kameras stehen, erfolgt die Übergabe mit Kameras.pbCAM1.
Die Funktion initCam stellt zunächst die Verbindung mit dem Vorschaufenster her, das funktioniert immer. Dann kommt der Aufruf von setCam.  Bei der ersten Kamera (egal ob Cam1 oder Cam2) funktioniert es immer. Es öffnet sich der Dialog zur Auswahl der Kamera, und nach Auswahl einer der beiden vorhandenen Kameras kommt auf die Nachricht WM_CAP_DRIVER_CONNECT  immer ein true zurück. Anschließend erscheint das Kamerabild in der PictureBox. 
Bei der zweiten Kamera kommt leider meistens kein Auswahldialog und dann ein false zurück. 
Wenn die Initialisierung funktioniert hat, geht der Rest immer einwandfrei und stabil. Wenn die Initialisierung der zweiten Kamera nicht funktioniert hat, dann hilt gelegentlich ein einfacher Neustart des Debuggers ohne irgendeine Veränderung in er Quelle! Oft muss ich es fünf, sechsmal hintereinander probieren, bis es dann geht. Allerdings geht es nur, wenn ich in der Entwicklungsumgebung (Visual Basic Express 2010 bzw 2012) im Debug Mode arbeite. In der erzeugten Exe geht die zweite Kamera nie.
Was mache ich bei der Nutzung der beiden Kameras falsch?
Bei Bedarf lade ich auch gerne mehr vom Code hoch, zunächst wollte ich die Codemenge möglichst klein halten.
Gruß und Danke für Eure Unterstützung
computerschrat
Hier nun der Auszug aus dem Code:
#########################################################
Public Class iCam
	...
	...
	
    Private iDevice As String
    Private hHwnd As Integer
    Private lwndC As Integer
    Public iRunning As Boolean
    Private CamFrameRate As Integer = 10
    Private OutputHeight As Integer = 480
    Private OutputWidth As Integer = 640
	...
	...
	
	Public Sub initCam(ByVal parentH As Integer)
        'Gets the handle and initiates camera setup
        If Me.iRunning = True Then
            MessageBox.Show("Camera Is Already Running")
            Exit Sub
        Else
            hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, OutputWidth, CShort(OutputHeight), parentH, 0)
            If setCam() = False Then
                MessageBox.Show("Error setting Up Camera")
                closeCam()
            End If
        End If
    End Sub
    Private Function setCam() As Boolean
        'Sets all the camera up
        If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, CShort(iDevice), CType(0, String)) = 1 Then
            SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, CShort(CamFrameRate), CType(0, String))
            SendMessage(hHwnd, WM_CAP_SET_PREVIEW, 1, CType(0, String))
            Me.iRunning = True
            Return True
        Else
            Me.iRunning = False
            Return False
        End If
    End Function
	...
	...
    Public Function closeCam() As Boolean
        'Closes the camera
        If Me.iRunning Then
            closeCam = CBool(SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, 0, CType(0, String)))
            Me.iRunning = False
        End If
        Return Me.iRunning
    End Function
	...
	...
End Class
Und hier der zweite Teil
#####################################################################
Imports System.IO
Public Class Form1
    Inherits System.Windows.Forms.Form
	...
	...
    Private Cam1 As iCam
    Private Cam2 As iCam
	...
	...
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Cam1 = New iCam
        Cam2 = New iCam
		...
		...
	End Sub
	
    Private Sub StartCam1()
        Cam1.initCam(Kameras.pbCam1.Handle.ToInt32)
		...
		...
	End Sub
	
	Private Sub StartCam2()
        Cam2.initCam(Kameras.pbCam2.Handle.ToInt32)
		...
		...
	End Sub