如何在后台静默拍摄我的网络摄像头(VB.NET) [英] How do I silently snap a picture through my webcam in the background (VB.NET)

查看:160
本文介绍了如何在后台静默拍摄我的网络摄像头(VB.NET)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好我一直在寻找一些简单的代码,它们不会在程序的GUI上显示任何网络摄像头图片,而只是拍摄照片并在后台谨慎保存。你可能会问为什么我需要这样做?好吧,它用于我的加密程序中随机密钥生成,因为我的计划是从保存的图片中获取哈希并将其用作随机密钥,然后删除图片。对不起,我没有任何代码可以显示我自己,因为我不想被某些人视为懒惰,我只想要一些尽可能短的代码来完成这项任务,但因为我没有在这里使用vb.net的区域,你处理像网络摄像头这样的外部设备,所以我不太清楚如何解释这段代码来缩短它。下面的代码是一个程序,在GUI中有一个设备选择,用户可以选择要使用的网络摄像头,它有一个可以看到实时摄像机流的屏幕,有一个开始/停止按钮来停止/停止摄像机实时流,最后有一个另存为按钮,用户选择保存图片。下面是表格布局,谢谢。

christianshelton | Flickr - 照片分享! [ ^ ]



我尝试过:



 公开  Form1 
Const WM_CAP 作为 =& H400S
Const WM_CAP_DRIVER_CONNECT 作为 整数 = WM_CAP + 10
Const WM_CAP_DRIVER_DISCONNECT 作为 整数 = WM_CAP + 11
Const WM_CAP_EDIT_COPY 作为 整数 = WM_CAP + 30
Const WM_CAP_SET_PREVIEW As < span class =code-keyword>整数 = WM_CAP + 50
Const WM_CAP_SET_PREVIEWRATE 作为 整数 = WM_CAP + 52
Const WM_CAP_SET_SCALE 作为 整数 = WM_CAP + 53
Const WS_CHILD As 整数 =& H40000000
Const WS_VISIBLE 作为 整数 =& H10000000
Const SWP_NOMOVE 作为 =& H2S
Const SWP_NOSIZE As = 1
Const SWP_NOZORDER 作为 =& H4S
Const HWND_BOTTOM As = 1
Dim iDevice As 整数 = 0
Dim hHwnd < span class =code-keyword>作为 整数
声明 函数 SendMessage Lib user32 别名 SendMessageA ByVal hwnd 作为 整数 ByVal wMsg 作为 整数 ByVal wParam As 整数 ByVal lParam 作为 对象作为 整数
声明 功能 SetWindowPos Lib 使用r32 别名 SetWindowPos ByVal hwnd 作为 整数 ByVal hWndInsertAfter 作为 整数 ByVal x 作为 整数 ByVal y 作为 整数 ByVal cx 作为 整数 ByVal cy 作为 整数 ByVal wFlags As Inte ger 作为 整数
声明 功能 DestroyWindow Lib user32 ByVal hndw As < span class =code-keyword> Integer ) As Boolean
< span class =code-keyword>声明 功能 capCreateCaptureWindowA Lib avicap32.dll ByVal lpszWindowName 作为 字符串 ByVal dwStyle 作为 整数 ByVal x 作为 整数 ByVal y 作为 整数 ByVal nWidth 作为 整数 ByVal nHeight 作为 ByVal hWndParent 作为 整数 ByVal nID 作为 整数 As 整数
声明 功能 capGetDriverDescriptionA Lib avicap32.dll ByVal wDriver 作为 ByVal lpszName < span class =code-keyword> As String ByVal cbName 作为 整数 ByVal lpszVer 作为 字符串 ByVal cbVer 正如 整数作为 布尔

私有 Sub LoadDeviceList()
Dim strName As 字符串 =空格( 100
Dim strVer As String =空格( 100
Dim bReturn As 布尔值
Dim x 作为 整数 = 0

bReturn = capGetDriverDescriptionA( x,strName, 100 ,strVer, 100
如果 bReturn 那么 lstDevices.Items.Add(strName.Trim)
x + = 1
循环直到bReturn = False
结束 Sub

私有 Sub OpenPreviewWindow( )
Dim iHeight As 整数 = picCapture.Height
Dim iWidth As 整数 = picCapture.Width
hHwnd = capCreateCaptureWindowA(iDevice,WS_VISIBLE WS_CHILD, 0 0 640 480 ,picCapture.Handle.ToInt32, 0
如果 SendMessage(hHwnd,WM_CAP_DRIVER_CONNECT, iDevice, 0 然后
SendMessage(hHwnd,WM_CAP_SET_SCALE, True 0
SendMessage(hHwnd,WM_CAP_SET_PREVIEWRATE, 66 0
SendMessage(hHwnd,WM_CAP_SET_PREVIEW, True 0
SetWindowPos(hHwnd,HWND_BOTTOM, 0 0 ,picCapture.Width,picCapture.Height,SWP_NOMOVE SWP_NOZORDER)
btnSave.Enabled = True
btnStop.Enabled = True
btnStart.Enabled = False
其他
DestroyWindow (hHwnd)
btnSave.Enabled = False
结束 如果
结束 Sub

私有 Sub btnSave_Click( ByVal 发​​件人作为系统。对象 ByVal e < span class =code-keyword> As System.EventArgs)句柄 btnSave.Click
Dim 数据 As IDataObject
Dim bmap As Image
SendMessage(hHwnd,WM_CAP_EDIT_COPY, 0 0
data = Clipb oard.GetDataObject()
如果 data.GetDataPresent( GetType (System.Drawing.Bitmap) )然后
bmap = CType (data.GetData( GetType (System.Drawing.Bitmap)),Image)
picCapture.Image = bmap
ClosePreviewWindow()
btnSave.Enabled = 错误
btnStop.Enabled = 错误
btnStart.Enabled = True
如果 sfdImage.ShowDialog = DialogResult.OK 那么
bmap。保存(sfdImage.FileName,Imaging.ImageFormat.Bmp)
结束 如果
结束 如果
结束 Sub

私有 Sub ClosePreviewWindow()
SendMessage(hHwnd,WM_CAP_DRIVER_DISCONNECT, iDevice, 0
DestroyWindow(hHwnd)
结束 Sub

私有 Sub Form1_Load( ByVal sender As System。 Object ,< span class =code-keyword> ByVal e As System.EventArgs)句柄 < span class =code-keyword> MyBase .Load
LoadDeviceList()
End Sub

私有 Sub btnStart_Click( ByVal sender As System。 Object ByVal e As System.EventArgs)句柄 btnStart.Click
OpenPreviewWindow()
btnStart.Enabled = False
btnStop.Enabled = True
结束 Sub

私人 Sub btnStop_Click( ByVal sender As System。 对象 ByVal e As System.EventArgs )句柄 btnStop.Click
ClosePreviewWindow()
btnStart.Enabled = True
btnStop.Enabled = False
结束 Sub
结束

解决方案

这是我的底线:



  • 有人询问有关使用网络摄像头图像的问题并回答了这么多次,一次又一次地回答它真的很糟糕。解决方案(很多)的一个很好的来源是CodeProject搜索:搜索 - CodeProject [< a href =http://www.codeproject.com/search.aspx?doctypeid=1%3b3%3b5target =_ blanktitle =New Window> ^ ]。
  • 我知道你的想法可行,但我确信它没有任何加密价值。如果我没有说服你,我相信你有一切可以发展它。




-SA

Hi I have been looking everywhere for some simple code that does not show any webcam picture on the program's GUI but just takes the picture and saves discreetly in the background. You may ask why I need to do this? Well it's for use in my encryption programs for random key generation as my plan is to take a hash from the saved picture and use that as a random "key" then to delete the picture afterwards. I am sorry I don't have any code to show of my own as I don't want to be perceived as 'lazy' by some I just want some short as possible code to do this task but as I am not used in this area of vb.net where you handle external devices like webcams so I don't quite know how to interpret this code to shorten it down. The code below is of a program that has a device selection in the GUI which the user can select the webcam to use, it has a screen in which the live camera stream can be seen,has a start/stop button to stop/stop the camera live stream and finally has a 'save as' button where the user chooses to save the picture. Below is the form layout, Thank you.
christianshelton | Flickr - Photo Sharing![^]

What I have tried:

Public Class Form1
    Const WM_CAP As Short = &H400S
    Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
    Const WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
    Const WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
    Const WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
    Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
    Const WM_CAP_SET_SCALE As Integer = WM_CAP + 53
    Const WS_CHILD As Integer = &H40000000
    Const WS_VISIBLE As Integer = &H10000000
    Const SWP_NOMOVE As Short = &H2S
    Const SWP_NOSIZE As Short = 1
    Const SWP_NOZORDER As Short = &H4S
    Const HWND_BOTTOM As Short = 1
    Dim iDevice As Integer = 0
    Dim hHwnd As Integer
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
    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
    Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
    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
    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

    Private Sub LoadDeviceList()
        Dim strName As String = Space(100)
        Dim strVer As String = Space(100)
        Dim bReturn As Boolean
        Dim x As Integer = 0
        Do
            bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
            If bReturn Then lstDevices.Items.Add(strName.Trim)
            x += 1
        Loop Until bReturn = False
    End Sub

    Private Sub OpenPreviewWindow()
        Dim iHeight As Integer = picCapture.Height
        Dim iWidth As Integer = picCapture.Width
        hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480, picCapture.Handle.ToInt32, 0)
        If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
            SendMessage(hHwnd, WM_CAP_SET_SCALE, True, 0)
            SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
            SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
            SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, picCapture.Width, picCapture.Height, SWP_NOMOVE Or SWP_NOZORDER)
            btnSave.Enabled = True
            btnStop.Enabled = True
            btnStart.Enabled = False
        Else
            DestroyWindow(hHwnd)
            btnSave.Enabled = False
        End If
    End Sub

    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Dim data As IDataObject
        Dim bmap As Image
        SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0)
        data = Clipboard.GetDataObject()
        If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
            bmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Image)
            picCapture.Image = bmap
            ClosePreviewWindow()
            btnSave.Enabled = False
            btnStop.Enabled = False
            btnStart.Enabled = True
            If sfdImage.ShowDialog = DialogResult.OK Then
                bmap.Save(sfdImage.FileName, Imaging.ImageFormat.Bmp)
            End If
        End If
    End Sub

    Private Sub ClosePreviewWindow()
        SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0)
        DestroyWindow(hHwnd)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LoadDeviceList()
    End Sub

    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
        OpenPreviewWindow()
        btnStart.Enabled = False
        btnStop.Enabled = True
    End Sub

    Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
        ClosePreviewWindow()
        btnStart.Enabled = True
        btnStop.Enabled = False
    End Sub
End Class

解决方案

Here is my bottom line:

  • The question about using images from a Web camera was asked and answered so many times that it would be really bad to answer it again and again. A good source for the solutions (many) is CodeProject search: Search — CodeProject[^].
  • I know your idea can work, but I am sure it doesn't have any cryptographic value. I believe you have everything to develop it, if I did not convince you.


—SA


这篇关于如何在后台静默拍摄我的网络摄像头(VB.NET)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆