Hi,
Here is a class I have been working on that creates a capture window
inside a picturebox. In the opencapturewind ow method pass in the handle of
the picturebox to place the window and the height and width of the window.
GetImage copies the image to the clipboard then returns the image as a
bitmap. Hope this helps.
Imports System.Runtime. InteropServices
Imports System.Windows. Forms
Imports System.Drawing
Public Class WebcamCaptureIm age
Const WM_CAP As Short = &H400S
Const WM_CAP_DRIVER_C ONNECT As Integer = WM_CAP + 10
Const WM_CAP_DRIVER_D ISCONNECT As Integer = WM_CAP + 11
Const WM_CAP_EDIT_COP Y As Integer = WM_CAP + 30
Const WM_CAP_SET_PREV IEW As Integer = WM_CAP + 50
Const WM_CAP_SET_PREV IEWRATE As Integer = WM_CAP + 52
Const WM_CAP_SET_SCAL E 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
Dim iDevice As Integer = 0 ' Current device ID
Dim hHwnd As Integer ' Handle to preview window
Dim mDevice As Collection
Dim bPreviewing As Boolean = False
Declare Function SendMessage Lib "user32" Alias "SendMessag eA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer
Declare Function SetWindowPos Lib "user32" Alias "SetWindowP os" (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 capCreateCaptur eWindowA Lib "avicap32.d ll" _
(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 capGetDriverDes criptionA Lib "avicap32.d ll" (ByVal wDriver
As Short, _
ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String,
_
ByVal cbVer As Integer) As Boolean
Private Sub LoadDeviceList( )
Dim strName As String = Space(100)
Dim strVer As String = Space(100)
Dim bReturn As Boolean
Dim x As Integer = 0
'
' Load name of all avialable devices into the lstDevices
'
mDevice = New Collection
Do
'
' Get Driver name and version
'
bReturn = capGetDriverDes criptionA(x, strName, 100, strVer, 100)
'
' If there was a device add device name to the list
'
If bReturn Then
Dim wci As New WebcamInfo
With wci
..Device = strName
..Version = strVer
End With
mDevice.Add(wci )
End If
x += 1
Loop Until bReturn = False
End Sub
Public Function OpenPreviewWind ow(ByVal hWndCapture As IntPtr, ByVal h As
Integer, ByVal w As Integer) As Boolean
'
' Open Preview window in picturebox
'
If bPreviewing Then ClosePreviewWin dow()
hHwnd = capCreateCaptur eWindowA(iDevic e, WS_VISIBLE Or WS_CHILD, 0, 0, 320,
_
240, hWndCapture.ToI nt32, 0)
'
' Connect to device
'
If SendMessage(hHw nd, WM_CAP_DRIVER_C ONNECT, iDevice, 0) Then
'
'Set the preview scale
'
SendMessage(hHw nd, WM_CAP_SET_SCAL E, True, 0)
'
'Set the preview rate in milliseconds
'
SendMessage(hHw nd, WM_CAP_SET_PREV IEWRATE, 66, 0)
'
'Start previewing the image from the camera
'
SendMessage(hHw nd, WM_CAP_SET_PREV IEW, True, 0)
'
' Resize window to fit in picturebox
'
SetWindowPos(hH wnd, HWND_BOTTOM, 0, 0, w, h, _
SWP_NOMOVE Or SWP_NOZORDER)
bPreviewing = True
Else
'
' Error connecting to device close window
'
DestroyWindow(h Hwnd)
bPreviewing = False
End If
Return bPreviewing
End Function
Public Sub ClosePreviewWin dow()
'
' Disconnect from device
'
SendMessage(hHw nd, WM_CAP_DRIVER_D ISCONNECT, iDevice, 0)
'
' close window
'
DestroyWindow(h Hwnd)
End Sub
Public Function GetImage() As Bitmap
Dim data As IDataObject
Dim bmap As Bitmap
If Not bPreviewing Then Return Nothing
'
' Copy image to clipboard
'
SendMessage(hHw nd, WM_CAP_EDIT_COP Y, 0, 0)
'
' Get image from clipboard and convert it to a bitmap
'
data = Clipboard.GetDa taObject()
If data.GetDataPre sent(GetType(Sy stem.Drawing.Bi tmap)) Then
bmap = CType(data.GetD ata(GetType(Sys tem.Drawing.Bit map)), Bitmap)
ClosePreviewWin dow()
Return bmap
End If
Return Nothing
End Function
Protected Overrides Sub Finalize()
If bPreviewing Then
ClosePreviewWin dow()
End If
MyBase.Finalize ()
End Sub
Public ReadOnly Property DeviceList() As Collection
Get
Return mDevice
End Get
End Property
Public Sub New()
LoadDeviceList( )
If mDevice.Count = 0 Then
Throw New Exception("No Video Capture Device Present.")
End If
End Sub
End Class
Public Class WebcamInfo
Private mstrDevice As String
Private mstrVersion As String
Public Property Device() As String
Get
Return mstrDevice
End Get
Set(ByVal Value As String)
mstrDevice = Value
End Set
End Property
Public Property Version() As String
Get
Return mstrVersion
End Get
Set(ByVal Value As String)
mstrVersion = Value
End Set
End Property
End Class
Ken
---------------------------
"anonymous" <so*****@somedo main.com> wrote in message
news:%2******** ********@tk2msf tngp13.phx.gbl. ..
hi all,
I'm trying to use the capCreateCaptur eWindow (see
http://msdn.microsoft.com/library/de...turewindow.asp)
in a Windows Application Project. I want to pass Image as one of the
parameter but I figure that an Image doesn't have a handle. Previously I
had it working in a Web Application Project using the handle of a
PictureBox.
Is there any workaround? Please help and thank you very much.