0

我有一个使用可以拍照的网络摄像头的程序。本程序源码如下:

Imports System
Imports System.Runtime
Imports System.Runtime.InteropServices

Module modWebcam
    Public Const WM_CAP As Short = &H400S
Public Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
Public Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
Public Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
Public Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
Public Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
Public Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
Public Const WS_CHILD As Integer = &H40000000
Public Const WS_VISIBLE As Integer = &H10000000
Public Const SWP_NOMOVE As Short = &H2S
Public Const SWP_NOSIZE As Short = 1
Public Const SWP_NOZORDER As Short = &H4S
Public Const HWND_BOTTOM As Short = 1

Public iDevice As Integer = 0 ' Current device ID
Public hHwnd As Integer ' Handle to preview window

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
    <MarshalAs(UnmanagedType.AsAny)> ByVal lParam As Object) As Integer

Public Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (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

Public Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean

Public 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 hWndParent As Integer, _
    ByVal nID As Integer) As Integer

Public Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, _
    ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, _
    ByVal cbVer As Integer) As Boolean
End Module





Private Sub OpenPreviewWindow()
    On Error Resume Next
    ClearAllObject()

    Dim iHeight As Integer = Panel2.Height
    Dim iWidth As Integer = Panel2.Width

    '
    ' Open Preview window in picturebox
    '
    hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, _
        480, picEye.Handle.ToInt32, 0)

    '
    ' Connect to device
    '
    If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
        '
        'Set the preview scale
        '
        SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)

        '
        'Set the preview rate in milliseconds
        '
        SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)

        '
        'Start previewing the image from the camera
        '
        SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)

        '
        ' Resize window to fit in picturebox
        '
        SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picEye.Width, picEye.Height, _
                SWP_NOMOVE Or SWP_NOZORDER)


    End If
End Sub







  Private Sub bntVideoFormat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bntVideoFormat.Click
        On Error Resume Next
        Main_Frm.webcam.ResolutionSetting()
    End Sub

   Private Sub Btn_AdvanceSetting(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AdvanceSetting.Click
        On Error Resume Next
        Main_Frm.webcam.AdvanceSetting()
    End Sub


         Private Sub Btn_showWebcam(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_showWebcam.Click
       picEye.SizeMode = PictureBoxSizeMode.StretchImage
            webcam = New WebCam()
            webcam.InitializeWebCam(picEye)
            webcam.Start()
End Sub

我希望 S-video video composet 的源代码改变它。但是我不能。

4

1 回答 1

0

WM_CAP_DLG_*要更改源,如果可能的话,您需要使用消息弹出配置对话框之一。您很可能需要WM_CAP_DLG_VIDEOSOURCE. 注意:

每个捕获驱动程序的视频源对话框都是唯一的。某些捕获驱动程序可能不支持视频源对话框。

您将需要额外的 API 常量,您可以从以下位置获取这些值:

  #region API Constants
  public const int WM_USER = 1024;
  public const int WM_CAP_CONNECT = 1034;
  public const int WM_CAP_DISCONNECT = 1035;
  public const int WM_CAP_GET_FRAME = 1084;
  public const int WM_CAP_COPY = 1054;
  public const int WM_CAP_START = WM_USER;
  public const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
  public const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
  public const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
  public const int WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44;
  public const int WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45;
  public const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
  public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
  #endregion

另请注意,您为视频选择了最古老的 Windows API,而且它非常有限,因此您可能需要考虑切换到更新的东西。

于 2015-04-18T10:44:22.673 回答