Qué tal amigos, estoy realizando una aplicación de procesamiento de video, para ello estoy utilizando AVICap. De hecho, ya he realizado lo que intento hacer, con C (sin AVICap) y con VB.NET, sin embargo, por motivos didáctivos me han pedido lo implemente también en VB 6 :p.
El problema es que de VB no conozco demasiado, y tengo problemas para poder configurar la función "callback" que se ejecutará al momento de que la cámara se actualiza con el siguiente frame. En VB.NET lo estoy haciendo así (lo tomé de otro código que encontré):
Módulo:
Delegate Function CallBackDelegate(ByVal hwnd As IntPtr, ByRef lpVhdr As VIDEOHDR) As IntPtr
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As CallBackDelegate) As IntPtr
Public Structure VIDEOHDR
Dim lpData As Integer '// address of video buffer
Dim dwBufferLength As Integer '// size, in bytes, of the Data buffer
Dim dwBytesUsed As Integer '// see below
Dim dwTimeCaptured As Integer '// see below
Dim dwUser As Integer '// user-specific data
Dim dwFlags As Integer '// see below
<VBFixedArray(3)> Dim dwReserved() As Integer '// reserved; do notuse}
End Structure
Clase del form principal:
Public Class frmCaptura
Dim hwdc As Integer
Dim conectado As Boolean
Dim g As Graphics
Private delCallBack As CallBackDelegate = New CallBackDelegate(AddressOf procesaFrame)
Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click
Dim res As Integer
hwdc = capCreateCaptureWindow("Captura Cámara", WS_CHILD Or WS_VISIBLE, 0, 0, 320, 240, picCaptura.Handle.ToInt32, 0)
If (hwdc <> 0) Then
res = SendMessage(hwdc, WM_CAP_DRIVER_CONNECT, 0, 0)
res = SendMessage(hwdc, WM_CAP_SET_PREVIEW, 1, 0)
res = SendMessage(hwdc, WM_CAP_SET_PREVIEWRATE, 60, 0)
conectado = True
' Configura callback
res = SendMessage(hwdc, WM_CAP_SET_CALLBACK_FRAME, New IntPtr(0), delCallBack)
Else
MsgBox("No se encontró dispositivo de captura")
End If
End Sub
...
Private Function procesaFrame(ByVal hwnd As IntPtr, ByRef lpVHdr As VIDEOHDR) As IntPtr
...
End Function
¿Alguien sabría cómo hacerlo en VB 6? De hecho, ya tengo un avance, pero me gustaría saber si alguien ya lo ha hecho y que pudiera echarme una mano
. Por el momento ya los estoy convenciendo de trabajar con .NET (con VB o C#, que lo manejo mejor), ya que con C/C++ por el momento nop (este si lo domino :p).
Gracias.