如何在Microsoft Access表单上使用网络摄像头捕获

时间:2019-06-25 15:58:56

标签: excel database ms-access access-vba webcam

我目前正在尝试在Microsoft Access 2013中设计一个数据库,以存储工厂中发现的有故障零件的记录。我正在尝试在表单上实现一个按钮,用户可以单击该按钮以访问其设备的摄像头,以在表单中附加故障图片。用户将在二合一的Dell Latitude 5290上使用Windows 10(如果有帮助的话)。

我尝试使用我在网上找到的代码,但是该代码非常古老,我认为在这个年龄段不起作用。无论如何,这是代码-

https://www.developerfusion.com/thread/46191/how-to-capture-picture-using-webcam-in-vb60/

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我看到您自己调整代码遇到了麻烦,所以让我引导您完成针对VBA调整代码的过程。

首先,我们将创建一个包含网络摄像头代码的表单,并向其中添加所需的控件。控件为:

4个按钮(分别称为cmd1,cmd2,cmd3和cmd4)和1个子窗体控件(称为PicWebCam)。我们正在使用一个子窗体来替换PictureBox对象,因为在Access中不可用。

由于子窗体需要显示某些内容,因此我们在设计视图中创建了第二个窗体,并将记录选择器和导航按钮设置为“否”。我们不向该窗体添加任何控件,并且使其足够小以使其没有滚动酒吧。然后,将子窗体控件的源对象设置为刚创建的窗体。

然后,代码还使用CommonDialog控件让我们选择文件路径来保存图片。虽然Windows + Access的某些组合提供了该功能,但我们不能依靠它,因此我们将使用FileDialog。

要获取文件路径,我们将以下代码添加到表单模块中:

Function GetSavePath() As String
    Dim f As Object 'FileDialog
    Set f = Application.FileDialog(2) 'msoFileDialogSaveAs
    If f.Show <> 0 Then GetSavePath = f.SelectedItems(1)
End Function

然后,我们复制粘贴初始声明(类型和声明函数语句),并进行2次调整:

  1. 由于我们要将其放置在表单模块中,因此对于默认情况下的所有私有内容,Public需要删除,对于非私有内容,则将其更改为Private

  2. 由于我们希望与64位访问兼容(您说过并不需要,但是无论如何都要添加它),因此我们想在所有外部函数中添加PtrSafe关键字,并将所有指针的类型从Long更改为LongPtr。该代码位于我们刚刚创建的函数之前。

Const WS_CHILD As Long = &H40000000
Const WS_VISIBLE As Long = &H10000000

Const WM_USER As Long = &H400
Const WM_CAP_START As Long = WM_USER

Const WM_CAP_DRIVER_CONNECT As Long = WM_CAP_START + 10
Const WM_CAP_DRIVER_DISCONNECT As Long = WM_CAP_START + 11
Const WM_CAP_SET_PREVIEW As Long = WM_CAP_START + 50
Const WM_CAP_SET_PREVIEWRATE As Long = WM_CAP_START + 52
Const WM_CAP_DLG_VIDEOFORMAT As Long = WM_CAP_START + 41
Const WM_CAP_FILE_SAVEDIB As Long = WM_CAP_START + 25

Private Declare PtrSafe Function capCreateCaptureWindow _
    Lib "avicap32.dll" Alias "capCreateCaptureWindowA" _
         (ByVal lpszWindowName As String, ByVal dwStyle As Long _
        , ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long _
        , ByVal nHeight As Long, ByVal hwndParent As LongPtr _
        , ByVal nID As Long) As Long

Private Declare PtrSafe Function SendMessage Lib "user32" _
    Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long _
        , ByVal wParam As Long, ByRef lParam As Any) As Long

Dim hCap As LongPtr

现在,我们可以复制粘贴实际功能,并进行2个更改:

  1. 我们使用GetSavePath函数代替用户常用的对话框控制代码来获取用户要保存文件的路径。
  2. 我们使用PicWebCam.hWnd而不是PicWebCam.Form.hWnd来获取要用网络摄像头供稿填充的帧的hWnd。
Private Sub cmd4_Click()
Dim sFileName As String
    Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(False), 0&)
    sFileName = GetSavePath
    Call SendMessage(hCap, WM_CAP_FILE_SAVEDIB, 0&, ByVal CStr(sFileName))
DoFinally:
    Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
End Sub

Private Sub Cmd3_Click()
Dim temp As Long
temp = SendMessage(hCap, WM_CAP_DRIVER_DISCONNECT, 0&, 0&)
End Sub


Private Sub Cmd1_Click()
    hCap = capCreateCaptureWindow("Take a Camera Shot", WS_CHILD Or WS_VISIBLE, 0, 0, PicWebCam.Width, PicWebCam.Height, PicWebCam.Form.hWnd, 0)
    If hCap <> 0 Then
        Call SendMessage(hCap, WM_CAP_DRIVER_CONNECT, 0, 0)
        Call SendMessage(hCap, WM_CAP_SET_PREVIEWRATE, 66, 0&)
        Call SendMessage(hCap, WM_CAP_SET_PREVIEW, CLng(True), 0&)
    End If
End Sub

Private Sub Cmd2_Click()
Dim temp As Long
temp = SendMessage(hCap, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&)
End Sub


Private Sub Form_Load()
cmd1.Caption = "Start &Cam"
cmd2.Caption = "&Format Cam"
cmd3.Caption = "&Close Cam"
cmd4.Caption = "&Save Image"
End Sub

最后,由于我们为Form_Load事件添加了事件处理程序,因此我们需要确保表单的On Load属性设置为[Event Procedure]。我们添加的所有命令按钮的On Click属性也是如此。

就这样,我们已经成功地将网络摄像头代码从VB6迁移到了VBA,并重新创建了您提供的链接中稀疏描述的表单。大部分代码都归功于该链接上的作者。

您可以临时下载结果here。请注意,出于教育目的,我建议您不要这样做,因为您不应该信任Internet上的随机陌生人,因为他们会给您未签名的可执行文件。但是,如果遇到错误,此功能非常有用,因此可以检查它是否是网络摄像头兼容性问题或错误。

请注意,我尚未对原始代码进行任何实际的功能更改。