我正在尝试创建一个使用 avicap32.dll 录制视频的应用程序,但不使用用户界面。我找到的示例代码(显示如何录制视频而不仅仅是捕获图像的唯一代码)使用需要图片框的句柄 ID 的 hWnd。有什么办法可以绕过这个,只需连接到驱动程序,录制并保存视频?
我的代码如下:
Imports System
Imports System.Runtime.InteropServices
Public Class Recorder
Const WM_CAP_START = &H400S
Const WS_CHILD = &H40000000
Const WS_VISIBLE = &H10000000
Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11
Const WM_CAP_EDIT_COPY = WM_CAP_START + 30
Const WM_CAP_SEQUENCE = WM_CAP_START + 62
Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
Const WM_CAP_SET_SCALE = WM_CAP_START + 53
Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50
Const SWP_NOMOVE = &H2S
Const SWP_NOSIZE = 1
Const SWP_NOZORDER = &H4S
Const HWND_BOTTOM = 1
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriverIndex As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer 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 hWnd As Integer, ByVal nID As Integer) As Integer
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer
Private Shared Function ReturnDriver() As Integer 'As String
Dim DriverName As String = Space(100)
Dim DriverVersion As String = Space(100)
'Dim ReturnDriverName As String = ""
Dim DriverIndex As Integer = Nothing
For i As Integer = 0 To 9
If capGetDriverDescriptionA(i, DriverName, 80, DriverVersion, 80) Then
'lstVideoSources.Items.Add(DriverName.Trim)
'ReturnDriverName = DriverName.Trim
DriverIndex = i
Exit For
End If
Next
Return DriverIndex
End Function
Public Shared Sub StartRecording()
Dim DriverVersion As Integer = ReturnDriver()
If SendMessage(0, WM_CAP_DRIVER_CONNECT, DriverVersion, 0) Then
SendMessage(0, WM_CAP_SEQUENCE, 0, 0)
End If
End Sub
Public Shared Sub StopRecording()
SendMessage(0, WM_CAP_FILE_SAVEAS, 0, "C:\records\" & Now().ToString() & ".avi")
End Sub
End Class