Results 1 to 2 of 2

Thread: Capturing screen and webcam video simultaneously?

  1. #1
    sspears2020 is offline VB.NET Forum Newbie
    .NET Framework
    .NET 3.5
    Join Date
    Nov 2010

    Question Capturing screen and webcam video simultaneously?

    Hey guys,

    I'm working on a screen capture and webcam capture program that will record both at the same time. I currently have a button that starts the screen cap (while opening a ppt) and a keyboard hook that stops it when I hit F12. I also have a button that starts webcam recording, and a button that stops the recording.

    So they are both working individually, but when I try to do both at the same time (calling both actions when I hit the start capture button) it sort of freezes up both processes. I'm thinking maybe they need to be run on different threads but I've tried doing so and I think I'm either doing it wrong or its just not making any difference?

    Also on a side note - when I am capturing video from the webcam the keyboard hook no longer works :/

    Here is the code for my form, if you want the keyboard hook let me know:

    Imports Microsoft.Expression.Encoder.ScreenCapture
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Interop.PowerPoint
    Imports Microsoft.Expression.Encoder.Devices
    Imports System.Runtime.InteropServices
    Imports System.Windows.Forms
    Imports System.Threading
    Public Class VideoRecorder
        Inherits System.Windows.Forms.Form
        Dim ScreenCap As New ScreenCaptureJob
        Dim appPowerpoint As PowerPoint.Application = New PowerPoint.Application
        Dim ShutDownAll As Boolean = False
        Dim shortName As String
        ' Create constant using attend in function of DLL file.
        Const WM_CAP As Short = &H400S
        Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
        Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
        Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
        Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
        Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
        Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
        Const WS_CHILD As Integer = &H40000000
        Const WS_VISIBLE As Integer = &H10000000
        Const SWP_NOMOVE As Short = &H2S
        Const SWP_NOSIZE As Short = 1
        Const SWP_NOZORDER As Short = &H4S
        Const HWND_BOTTOM As Short = 1
        Const WM_CAP_FILE_SAVEAS As Integer = WM_CAP + 23
        Const WM_CAP_SEQUENCE As Integer = WM_CAP + 62
        Dim iDevice As Integer = 0  ' Normal device ID 
        Dim hHwnd As Integer  ' Handle value to preview window
        ' Declare function from AVI capture DLL.
        Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
             ByVal lParam As String) As Integer
        Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Integer, _
            ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, _
            ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
        Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
        Declare Function capCreateCaptureWindowA Lib "avicap32.dll" _
            (ByVal lpszWindowName As String, ByVal dwStyle As Integer, _
            ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, _
            ByVal nHeight As Short, ByVal hWndParent As Integer, _
            ByVal nID As Integer) As Integer
        Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _
            ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, _
            ByVal cbVer As Integer) As Boolean
        Dim WithEvents K As New Keyboard
        Private Sub VideoRecorder_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        End Sub
        Private Sub VideoRecorder_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        End Sub
        Private Sub K_Down(ByVal Key As String) Handles K.Down
            If Key.ToString = "<F12>" Then
                Label1.Text = Key.ToString
                ShutDownAll = True
                Timer2.Enabled = True
            End If
        End Sub
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            If ShutDownAll = True Then
            End If
        End Sub
        Private Sub btnChooseFile_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChooseFile.Click
            txtChooseFile.Text = ChooseFileDialog.FileName
            Dim less As Integer
            If txtChooseFile.Text.Contains(".ppt") Then
                less = 4
                If txtChooseFile.Text.Contains(".pptx") Then
                    less = 5
                End If
            End If
            shortName = txtChooseFile.Text.Substring(0, txtChooseFile.Text.Length - less)
        End Sub
        Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
            If txtChooseFile.Text = "" Then
                MsgBox("Please choose a PowerPoint file.")
                Exit Sub
            End If
            'open powerpoint slideshow
            Catch ex As Exception
            End Try
            'capture settings
            ScreenCap.CaptureMouseCursor = False
            ScreenCap.CaptureRectangle = Screen.PrimaryScreen.Bounds
            ScreenCap.ShowCountdown = True
            ScreenCap.OutputScreenCaptureFileName = shortName + "_scr" + ".wmv"
            ScreenCap.ScreenCaptureVideoProfile.FrameRate = 60
        End Sub
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If appPowerpoint.Presentations.Count = 1 Then
                Timer1.Enabled = False
            End If
        End Sub
        Private Sub StartShow()
        End Sub
        '***************** VIDEO CAPTURE ************************
        Private Sub OpenPreviewWindow()
            Dim iHeight As Integer = picCapture.Height
            Dim iWidth As Integer = picCapture.Width
            ' Open Preview window in picturebox .
            ' Create a child window with capCreateCaptureWindowA so you can display it in a picturebox.
            hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
                480, picCapture.Handle.ToInt32, 0)
            'Label1.Text = SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0)
            ' Connect to device
            If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
                ' Set the preview scale
                SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
                ' Set the preview rate in milliseconds
                SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 15, 0)
                ' Start previewing the image from the camera 
                SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
                ' Resize window to fit in picturebox 
                SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, _
                                       SWP_NOMOVE Or SWP_NOZORDER)
                'btnSave.Enabled = True
                btnStop.Enabled = True
                ' Error connecting to device close window 
            End If
        End Sub
        ' Finally, to close the preview window, disconnect from the device and destroy the preview window. 
        Private Sub ClosePreviewWindow()
            ' Disconnect from device
            SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
            ' close window 
        End Sub
        Private Sub StartVideoCap()
                SendMessage(hHwnd, WM_CAP_SEQUENCE, 0, 0)
            Catch ex As Exception
            End Try
        End Sub
        Private Sub StopVideoCap()
            Dim avi As String = shortName & "_avi" & ".avi"
            'SAVE FILE
                SendMessage(hHwnd, WM_CAP_FILE_SAVEAS, 0, avi)
            Catch ex As Exception
            End Try
        End Sub
        Private Sub btnTestStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTestStart.Click
        End Sub
        Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
        End Sub
    End Class

  2. #2
    inilm is offline VB.NET Forum Newbie
    .NET Framework
    .NET 4.0
    Join Date
    May 2011
    hi sspears2020
    do u manage to solve your problem?
    I had the same problem too that freeze up my applications. If yes, please update me. TQ

Tags for this Thread


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts