如何在后台静默拍摄我的网络摄像头(VB.NET) [英] How do I silently snap a picture through my webcam in the background (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屋!