Private Sub ParentResizing(ByVal sender As Object, ByVal e As EventArgs)
If Not active Then Return
Try
' Resize window to fit in picturebox
SetWindowPos(capwnd, HWND_BOTTOM, 0, 0, capparent.ClientSize.Width, _
capparent.ClientSize.Height, _
SWP_NOMOVE Or SWP_NOZORDER)
capparent.BackgroundImage = Me.GetCurrentPicture()
Catch
End Try
End Sub
Public Sub StopCapture()
lastimage = Nothing
If active = False Then Return
SendMessage(capwnd, WM_CAP_SET_PREVIEW, 0, 0)
SendMessage(capwnd, WM_CAP_DRIVER_DISCONNECT, _
System.Runtime.InteropServices.Marshal.StringToCoTaskMemAnsi( _
wndname), 0)
DestroyWindow(capwnd)
RemoveHandler capparent.Resize, AddressOf ParentResizing
active = False
_filecapactive = False
End Sub
Private lastimage As Image
Public Function GetCurrentPicture() As Image
SendMessage(capwnd, WM_CAP_EDIT_COPY, 0, 0)
If Clipboard.ContainsImage Then
lastimage = Clipboard.GetImage()
End If
Return lastimage
End Function
Public Function StartFileCapture() As Boolean
If active = False Then Return False
If _filecapactive Then
Throw New InvalidOperationException("Der Datei-Aufnahmevorgang" & _
"wurde bereits gestartet. Benutzen Sie stattdessen die Funktion" & _
"CapFileSaveAs()")
End If
Dim success As Boolean = False
success = SendMessage(capwnd, WM_CAP_SEQUENCE, 0, 0)
_filecapactive = success
Return success
End Function
Public Function CapFileSaveAs(ByVal filename As String) As Boolean
If (Not active) Or (Not _filecapactive) Then Return False
Dim success As Boolean
Dim strptr As IntPtr = Marshal.StringToCoTaskMemAnsi(filename & Chr(0))
success = SendMessage(capwnd, WM_CAP_FILE_SAVEASA, 0, strptr.ToInt32)
Marshal.FreeCoTaskMem(strptr)
Return success
End Function
Public Property CaptureFileName() As String
Get
Dim strptr As IntPtr = Marshal.AllocCoTaskMem(255)
Dim success As Boolean = SendMessage(capwnd, _
WM_CAP_FILE_GET_CAPTURE_FILEA, 255, strptr.ToInt32)
Dim data(0 To 255) As Byte
Marshal.Copy(strptr, data, 0, 255)
Marshal.FreeCoTaskMem(strptr)
Return System.Text.Encoding.Default.GetString(data).Trim
End Get
Set(ByVal value As String)
If _filecapactive Then
Throw New InvalidOperationException("Der Datei-Aufnahmevorgang" & _
"wurde bereits gestartet. Benutzen Sie stattdessen die" & _
"Funktion CapFileSaveAs()")
End If
If _capfile <> value Then
_capfile = value
Dim strptr As IntPtr = Marshal.StringToCoTaskMemAnsi(_capfile & _
Chr(0))
Dim success As Boolean = SendMessage(capwnd, _
WM_CAP_FILE_SET_CAPTURE_FILEA, 0, strptr.ToInt32)
Marshal.FreeCoTaskMem(strptr)
End If
End Set
End Property
Public ReadOnly Property Status() As CAPSTATUS
Get
Dim retval As CAPSTATUS
SendMessage(capwnd, WM_CAP_GET_STATUS, _
System.Runtime.InteropServices.Marshal.SizeOf(retval), retval)
Return retval
End Get
End Property
Public ReadOnly Property IsCapturingToFile() As Boolean
Get
Return _filecapactive
End Get
End Property
Public ReadOnly Property IsActive() As Boolean
Get
Return active
End Get
End Property
Protected Overrides Sub Finalize()
StopCapture()
MyBase.Finalize()
End Sub
End Class Schwachsinnig diese Begrenzung auf 5 kb. 15 kb wär auch ganz Ok. Kriegt man wenigstens noch ganze Codeblöcke übertragen.
-----------------------------------
Betriebssystem: Schrott (Vista)
Entwicklungsumgebung: VS 2008
|