Imports System
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Cam

    
Private Const WM_USER As Integer = &H400
    
Private Const WS_CHILD As Integer = &H40000000
    
Private Const WS_VISIBLE As Integer = &H10000000
    
Private Const WM_CAP_START As Integer = WM_USER
    
Private Const WM_CAP_STOP As Integer = WM_CAP_START + 68
    
Private Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
    
Private Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP_START + 11
    
Private Const WM_CAP_SAVEDIB As Integer = WM_CAP_START + 25
    
Private Const WM_CAP_GRAB_FRAME As Integer = WM_CAP_START + 60
    
Private Const WM_CAP_SEQUENCE As Integer = WM_CAP_START + 62
    
Private Const WM_CAP_FILE_SET_CAPTURE_FILEA As Integer = WM_CAP_START + 20
    
Private Const WM_CAP_SEQUENCE_NOFILE As Integer = WM_CAP_START + 63
    
Private Const WM_CAP_SET_OVERLAY As Integer = WM_CAP_START + 51
    
Private Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
    
Private Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Integer = WM_CAP_START + 6
    
Private Const WM_CAP_SET_CALLBACK_ERROR As Integer = WM_CAP_START + 2
    
Private Const WM_CAP_SET_CALLBACK_STATUSA As Integer = WM_CAP_START + 3
    
Private Const WM_CAP_SET_CALLBACK_FRAME As Integer = WM_CAP_START + 5
    
Private Const WM_CAP_SET_SCALE As Integer = WM_CAP_START + 53
    
Private Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP_START + 52

    
Public Const WM_CAP_GET_CAPSTREAMPTR = WM_CAP_START + 1

    
Public Const WM_CAP_SET_CALLBACK_STATUS = WM_CAP_START + 3
    
Public Const WM_CAP_SET_CALLBACK_YIELD = WM_CAP_START + 4
    
Public Const WM_CAP_SET_CALLBACK_WAVESTREAM = WM_CAP_START + 7
    
Public Const WM_CAP_GET_USER_DATA = WM_CAP_START + 8
    
Public Const WM_CAP_SET_USER_DATA = WM_CAP_START + 9

    
Public Const WM_CAP_DRIVER_GET_NAME = WM_CAP_START + 12
    
Public Const WM_CAP_DRIVER_GET_VERSION = WM_CAP_START + 13
    
Public Const WM_CAP_DRIVER_GET_CAPS = WM_CAP_START + 14

    
Public Const WM_CAP_FILE_SET_CAPTURE_FILE = WM_CAP_START + 20
    
Public Const WM_CAP_FILE_GET_CAPTURE_FILE = WM_CAP_START + 21
    
Public Const WM_CAP_FILE_ALLOCATE = WM_CAP_START + 22
    
Public Const WM_CAP_FILE_SAVEAS = WM_CAP_START + 23
    
Public Const WM_CAP_FILE_SET_INFOCHUNK = WM_CAP_START + 24
    
Public Const WM_CAP_FILE_SAVEDIB = WM_CAP_START + 25

    
Public Const WM_CAP_EDIT_COPY = WM_CAP_START + 30

    
Public Const WM_CAP_SET_AUDIOFORMAT = WM_CAP_START + 35
    
Public Const WM_CAP_GET_AUDIOFORMAT = WM_CAP_START + 36

    
Public Const WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41
    
Public Const WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42
    
Public Const WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43
    
Public Const WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44
    
Public Const WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45
    
Public Const WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46

    
Public Const WM_CAP_GET_STATUS = WM_CAP_START + 54
    
Public Const WM_CAP_SET_SCROLL = WM_CAP_START + 55

    
Public Const WM_CAP_GRAB_FRAME_NOSTOP = WM_CAP_START + 61

    
Public Const WM_CAP_SET_SEQUENCE_SETUP = WM_CAP_START + 64
    
Public Const WM_CAP_GET_SEQUENCE_SETUP = WM_CAP_START + 65
    
Public Const WM_CAP_SET_MCI_DEVICE = WM_CAP_START + 66
    
Public Const WM_CAP_GET_MCI_DEVICE = WM_CAP_START + 67
    
Public Const WM_CAP_ABORT = WM_CAP_START + 69

    
Public Const WM_CAP_SINGLE_FRAME_OPEN = WM_CAP_START + 70
    
Public Const WM_CAP_SINGLE_FRAME_CLOSE = WM_CAP_START + 71
    
Public Const WM_CAP_SINGLE_FRAME = WM_CAP_START + 72

    
Public Const WM_CAP_PAL_OPEN = WM_CAP_START + 80
    
Public Const WM_CAP_PAL_SAVE = WM_CAP_START + 81
    
Public Const WM_CAP_PAL_PASTE = WM_CAP_START + 82
    
Public Const WM_CAP_PAL_AUTOCREATE = WM_CAP_START + 83
    
Public Const WM_CAP_PAL_MANUALCREATE = WM_CAP_START + 84

    
'// Following added post VFW 1.1
    Public Const WM_CAP_SET_CALLBACK_CAPCONTROL = WM_CAP_START + 85

    
'// Defines end of the message range
    Public Const WM_CAP_END = WM_CAP_SET_CALLBACK_CAPCONTROL

    
Private hWndC As IntPtr
    
Private bStat As Boolean = False

    
Private mControlPtr As IntPtr
    
Private mWidth As Integer
    
Private mHeight As Integer
    
Private mLeft As Integer
    
Private mTop As Integer

    
<DllImport("avicap32.dll")> _
    
Private Shared Function capCreateCaptureWindowA(ByVal lpszWindowName() As ByteByVal dwStyle As IntegerByVal x As IntegerByVal y As IntegerByVal nWidth As IntegerByVal nHeight As IntegerByVal hWndParent As IntPtr, ByVal nID As IntegerAs IntPtr
    
End Function


    
<DllImport("avicap32.dll")> _
    
Private Shared Function capGetVideoFormat(ByVal hWnd As IntPtr, ByVal psVideoFormat As IntPtr, ByVal wSize As IntegerAs Integer
    
End Function


    
<DllImport("User32.dll")> _
    
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As IntegerByVal wParam As IntegerByVal lParam As LongAs Boolean
    
End Function


    
Function capDlgVideoFormat() As Boolean
        capDlgVideoFormat 
= SendMessage(hWndC, WM_CAP_DLG_VIDEOFORMAT, 00)
    
End Function

    
Function capDlgVideoSource() As Boolean
        capDlgVideoSource 
= SendMessage(hWndC, WM_CAP_DLG_VIDEOSOURCE, 00)
    
End Function

    
Function capDlgVideoDisplay() As Boolean
        capDlgVideoDisplay 
= SendMessage(hWndC, WM_CAP_DLG_VIDEODISPLAY, 00)
    
End Function

    
Function capDlgVideoCompression() As Boolean
        capDlgVideoCompression 
= SendMessage(hWndC, WM_CAP_DLG_VIDEOCOMPRESSION, 00)
    
End Function


'接上节

    
'/// <summary>
    '/// 初始化摄像头
    '/// </summary>
    '/// <param name="handle">控件的句柄</param>
    '/// <param name="left">开始显示的左边距</param>
    '/// <param name="top">开始显示的上边距</param>
    '/// <param name="width">要显示的宽度</param>
    '/// <param name="height">要显示的长度</param>
    Public Sub New(ByVal handle As IntPtr, ByVal left As IntegerByVal top As IntegerByVal width As IntegerByVal height As Integer)
        mControlPtr 
= handle
        mWidth 
= width
        mHeight 
= height
        mLeft 
= left
        mTop 
= top
    
End Sub


    
'/// <summary>
    '/// 开始显示图像
    '/// </summary>
    Public Sub Start()
        
If bStat Then
            
Return
        
End If
        bStat 
= True
        
Dim lpszName(99As Byte

        hWndC 
= capCreateCaptureWindowA(lpszName, WS_CHILD Or WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0)

        
If hWndC.ToInt32() <> 0 Then
            SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 
00)
            SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 
00)
            SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 
00)
            SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 
00)
            SendMessage(hWndC, WM_CAP_SET_SCALE, 
10)
            SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 
660)
            SendMessage(hWndC, WM_CAP_SET_OVERLAY, 
10)
            SendMessage(hWndC, WM_CAP_SET_PREVIEW, 
10)
        
End If

        
Return
    
End Sub


    
'/// <summary>
    '/// 停止显示
    '/// </summary>
    Public Sub [Stop]()
        SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 
00)
        bStat 
= False
    
End Sub


    
'/// <summary>
    '/// 抓图
    '/// </summary>
    '/// <param name="path">要保存bmp文件的路径</param>
    Public Sub GrabImage(ByVal path As String)
        
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
        SendMessage(hWndC, WM_CAP_SAVEDIB, 
0, hBmp.ToInt64())
    
End Sub


    
'/// <summary>
    '/// 录像
    '/// </summary>
    '/// <param name="path">要保存avi文件的路径</param>
    Public Sub Kinescope(ByVal path As String)
        
Dim hBmp As IntPtr = Marshal.StringToHGlobalAnsi(path)
        SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 
0, hBmp.ToInt64())
        SendMessage(hWndC, WM_CAP_SEQUENCE, 
00)
    
End Sub


    
'/// <summary>
    '/// 停止录像
    '/// </summary>
    Public Sub StopKinescope()
        SendMessage(hWndC, WM_CAP_STOP, 
00)
    
End Sub

End Class


下面这个是测试窗体Form1.vb:

Public Class Form1
    
Inherits System.Windows.Forms.Form

    
Private cccap As Cam
Windows 窗体设计器生成的代码

    
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        cccap 
= New Cam(picView.Handle, 00, picView.Width, picView.Height)
    
End Sub


    
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        cccap.Start()
    
End Sub


    
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        cccap.Stop()
    
End Sub


    
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        cccap.GrabImage(
"c:\test.bmp")
    
End Sub


    
Private Sub Form1_Closed(ByVal sender As ObjectByVal e As System.EventArgs) Handles MyBase.Closed
        cccap 
= Nothing
    
End Sub


    
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        cccap.capDlgVideoSource()
    
End Sub


    
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        cccap.capDlgVideoFormat()
    
End Sub

End Class


摘自别人写的代码,会对你很有好处的。
posted on 2007-06-19 14:46  小黑三  阅读(1638)  评论(2编辑  收藏  举报