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

2023-12-01

我正在 Microsoft Access 2013 中设计一个数据库,用于存储工厂中发现的故障部件的记录。

我正在尝试在表单上实现一个按钮,用户可以单击以访问其设备的摄像头,以在表单中附加故障图片。用户在 Dell Latitude 5290 二合一电脑上使用 Windows 10。

我尝试了在网上找到的代码,但它非常旧。https://www.developerfusion.com/thread/46191/how-to-capture-picture-using-webcam-in-vb60/


我发现您自己调整代码时遇到了困难,所以让我引导您完成针对 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 位 Access(你说你不需要,但无论如何都添加它),我们想要添加PtrSafe关键字到所有外部函数,并更改所有指针的类型Long to 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。请注意,我建议您不要这样做,既是出于教育目的,也是因为您不应该相信互联网上随机的陌生人为您提供未签名的可执行文件。但如果您遇到错误,它会很有用,因此您可以检查它是否可能是网络摄像头兼容性问题或错误。

请注意,我没有对原始代码进行任何真正的功能更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Microsoft Access 表单上使用网络摄像头捕获? 的相关文章

  • 在vba中打乱数组[重复]

    这个问题在这里已经有答案了 我需要对数组中的值进行无重复的洗牌 我需要在代码中添加什么以避免重复 Function Resample data vector n UBound data vector ReDim shuffled vecto
  • 在 Git 上保存 Excel 文件的版本,以便稍后手动协调差异

    我将用一个月的时间更新Excel文件 这些文件的语言不是英语 我想我也可以使用 Git 来管理我想做的事情 情况 初始提交 我有一个用其他语言编写的 Excel 文件 我必须执行一些工作并用其中的数据填充 Excel 文件 My plan
  • SSIS Excel 导入强制错误的列类型

    我正在尝试使用 SSIS 将电子表格导入到我们的数据库中 由于某种原因 当其中两列包含字符数据时 SSIS 希望相信它们的类型为 Double 我尝试将列重新映射为 nvarchar 255 但它仍然不想选择它认为是双精度的数据 因为其中有
  • 该模型已具有同名的元素 - ASP.NET

    我正在使用 ASP Net Web 应用程序 每当我尝试添加FOREIGN KEY此错误出现在数据工具操作中 SQL71508 该模型已具有同名的元素 dbo FK Sellers Users SQL71508 该模型已经有一个元素 具有相
  • 在 Excel 中用 VBA 替换 Chr(160) 时遇到问题

    我收到 Excel 文件已有一段时间了 这些文件通常在帐户后面受特殊字符 alt 0160 的困扰 我通常只是在 Excel 中手动替换它 但最近我变得懒惰了 想使用我的 VBA 脚本替换它 该脚本用于将所需的列插入到我们的数据库中 Sub
  • 从命令行创建 Excel 文件

    有什么方法可以从命令行创建新的 Excel 文件吗 如果您需要创建的 Excel 文件始终相同 您可以手动创建模板 然后随意创建新文件 例如 copy template xlsx myNewSpreadsheet xlsx 如果您需要创建内
  • VBA getelementsbytagname问题

    早上好 我正在尝试提取 HTML 表信息并在 Excel 电子表格上整理结果 我正在使用getelementsbytagname table 0 函数来提取 HTML 表格信息 效果很好 有人可以告诉我这有什么意义吗 0 桌子之后 另外 我
  • Outlook 宏中的 SenderName 为空

    我想要得到SenderName和和To属性来自于MailItem对象 但它们是空白的 我可以看到有SentOn Subject以及其他不为空的属性 有谁知道为什么这两个是空白的 这是我的代码 Sub TestMacro Dim myOlAp
  • 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?

    我编写了一个 Delphi 程序 该程序从单个 XLS 文件的多个不同电子表格中提取数据并将其合并到文本文件中以供以后处理 这是德尔福7console程序 最相关的代码片段的摘录将向您表明 显然 我的程序表现得相当好 或者至少达到了它需要的
  • SQLite 性能基准 - 为什么 :memory: 这么慢...只有磁盘速度的 1.5 倍?

    为什么 sqlite 中的 memory 这么慢 我一直在尝试查看使用内存中的 sqlite 与基于磁盘的 sqlite 是否可以获得任何性能改进 基本上我想用启动时间和内存来换取非常快速的查询not在应用程序过程中击中磁盘 然而 以下基准
  • 使用git在测试和生产环境之间同步数据库

    我正在尝试在 php mysql 应用程序的开发过程中实现 git 到目前为止 我已经设置了 git repos 并且我们正在使用本地计算机进行测试 并且我们成功地将其用于文件 但我真的不知道如何处理数据库 服务器上有一个 cron 脚本
  • 数组 (UUID[ ]) 会破坏 1NF 吗?

    我的问题是包含 UUID 数组的字段是否会破坏范式 http en wikipedia org wiki Database normalization 在包含数组之前位于 NF 中的表中 原表 CREATE TABLE Floor Floo
  • 如何使用 Excel VBA 根据货币标准格式化列中的数字?

    我想格式化一列的所有单元格 数据是一个数字 我想从左边添加一个小数 之后只保留两位数 然后根据货币标准对其进行格式化 例如 Data Output 10000 100 00 112233 1 122 33 123456789 1 234 5
  • 给定 A 列中的值,在 EXCEL 中查找 B 列中的最小值/最大值

    我有一列公交车站 ID 号 A 列 B 列是不同的时间 其中每个值都是一个人上 下车的时间 为了知道公交车停了多长时间 我想在给定 A 的某个值的情况下找到 B 列中的最大值 最小值之间的差异 84009 9 17 38 AM 84009
  • Azure:用户登录失败

    我做了什么 我在 Azure 中添加了资源组 添加了带有先前资源组的 Web 服务 添加了带有先前资源组的 SQL Server 数据库 从此数据库检索生成的连接字符串并在此处提供用户名和密码 将此连接字符串添加到Web服务中的应用程序设置
  • django pandas dataframe 下载为 Excel 文件

    我有一个 Django 应用程序 将放置在 Docker 容器中 该应用程序以 Dataframe 格式准备数据 我想允许用户将数据作为 Excel 文件下载到他 她的本地驱动器 我过去使用过 df to excel 但这在这种情况下不起作
  • Firestore 每秒向一个集合写入 500 多次以上

    Firestore 的限制为每秒 500 次写入 to 一个集合 其中文档包含顺序值 索引字段 https cloud google com firestore quotas writes and transactions https cl
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么时候数据库被称为嵌入式数据库?

    术语 嵌入式数据库 与 数据库 具有不同的含义吗 我见过的嵌入式数据库有两种定义 嵌入式数据库就像专门为 嵌入式 空间 移动设备等 设计的数据库系统一样 这意味着它们在紧张的环境中 内存 CPU 方面 可以合理地执行 嵌入式数据库就像不需要
  • 一个大连接或多个查询哪个提供更好的性能?

    我有一个名为订单的表 订单上的一列是 customer id我有一个名为 customers 的表 有 10 个字段 给定两个选项 如果我想构建订单对象数组并嵌入订单对象中的是客户对象 我有两个选择 选项1 A 首先查询订单表 b 循环遍历

随机推荐