Как использовать захват веб-камеры в форме Microsoft Access - PullRequest
0 голосов
/ 25 июня 2019

В настоящее время я пытаюсь создать базу данных в Microsoft Access 2013 для хранения записей неисправных деталей, обнаруженных на заводе.Я пытаюсь реализовать кнопку в моей форме, где пользователь может щелкнуть по ней, чтобы получить доступ к камере своего устройства, чтобы прикрепить изображение ошибки в форме.Пользователь будет использовать Windows 10 на Dell latitude 5290 два в одном (если это поможет.)

Я пытался использовать код, который нашел в Интернете, но он очень старый, и я не верю, что он будет работать в этомвозраст.В любом случае, вот код:

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

Любая помощь будет принята с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 26 июня 2019

Я вижу, что у вас возникли проблемы с настройкой кода самостоятельно, поэтому позвольте мне рассказать вам о процессе его настройки для 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 до 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 и воссоздали форму, которая редко описывалась в предоставленной вами ссылке. По большей части кода авторы переходят по этой ссылке.

Вы можете временно загрузить результат здесь . Обратите внимание, что я рекомендую этого не делать, как в образовательных целях, так и потому, что вам не следует доверять случайным незнакомцам в Интернете, дающим вам неподписанные исполняемые файлы. Но это полезно, если вы столкнулись с ошибкой, поэтому вы можете проверить, может ли это быть проблема совместимости веб-камеры или ошибка.

Обратите внимание, что я не внес никаких реальных функциональных изменений в исходный код.

...