开发环境:VB6.0,检测用户点选监控中固定点的RGB值,监控为摄像头实时拍摄的录像,RGB值随着图像变化而变化

以下为Visual Basic 6.0编程环境开发,代码如下:

'视频动态链接库
Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const WM_CAP_START = &H400
Private Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
Private Const WM_CAP_SET_SCALE = WM_CAP_START + 53
Private Const WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52
Private Const WM_CAP_SET_PREVIEW = WM_CAP_START + 50
Private Const WM_CAP_GRAB_FRame_NOSTOP = WM_CAP_START + 61
 
Private Declare Function capCreateCaptureWindowA Lib "avicap32.dll" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Integer, _
ByVal hWndParent As Long, ByVal nID As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
 
'采集RGB动态链接库
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, _
    ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, _
    ByVal ySrc As Long, ByVal dwRop As Long) As Long
 
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, _
ByVal Y As Long) As Long
 
Private Type POINTAPI
    X As Long
    Y As Long
End Type
 
'加载鼠标左右键API
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
 
'定义点
Dim P As POINTAPI, Myhwnd As Long, MyDC As Long, rl As Long
 
'退出按钮
Private Sub Command1_Click()
    Unload Me
End Sub
 
'运行摄像功能
Public Sub Command2_Click()
'capCreateCaptureWindowA(),创建视频窗口,lpszWindowName 定义窗口名字为空
 
'dwStyle 定义窗口风格为WS_VISIBLE Or WS_CHILD,其中WS_VISIBLE是可见,不加该参数是创建之后看不见,只有用ShowWindow之类的函数才能让窗体显示
'而WS_CHILD表示生成的窗口是子窗口
 
'X,Y定义窗口的坐标位置为0,0
 
'nWidth、nHeight定义窗口长*宽为480*270
 
'hWndParent父窗口句柄为Me.hwnd
 
'序号为0
uwndc = capCreateCaptureWindowA("", WS_VISIBLE Or WS_CHILD, 0, 0, 480, 270, Me.hwnd, 0)
 
'传输消息,连接驱动
SendMessage uwndc, WM_CAP_DRIVER_CONNECT, 0, 0
 
'设置预览视频的缩放比例
SendMessage uwndc, WM_CAP_SET_SCALE, True, 0
 
'设置预览模式下图像的帧速度
SendMessage uwndc, WM_CAP_SET_PREVIEWRATE, 40, 0
 
'设置预览模式
SendMessage uwndc, WM_CAP_SET_PREVIEW, True, 0
 
'编写获取坐标代码,点是固定的
If GetAsyncKeyState(vbLeftButton) <> 0 Then
 
'获取点的坐标
GetCursorPos P
 
'获取指定窗口的设备场景,返回值为长整型,出错为0
MyDC = GetDC(Myhwnd)
'获取像素点的位置
rl = GetPixel(MyDC, P.X, P.Y)
 
End If
 
'调用Timer1过程,实时检测固定点的RGB值
Call Timer1_Timer
 
End Sub
 
Private Sub Timer1_Timer()
    Dim R As Long, G As Long, B As Long
 
    R = rl And &HFF
    G = (rl And &HFF00&) / &H100&
    B = (rl And &HFF000) / &H10000
    Label1.Caption = "R=" & R & vbCrLf & "G=" & G & vbCrLf & "B=" & B & vbCrLf & "#" & Hex(R) & Hex(G) & Hex(B)
End Sub

本人思路:以上代码是想要点选固定一点,Timer会实时更新该点的RGB值

问题:
1.运行后RGB值不会实时更新(有BUG)
2.单击停止运行后VB编程环境会无响应,即使按了Ctrl+Break也不好使,只有单击Command1执行Unload Me代码才能退出程序,请问如何解决?
3.如何调用不同插件过程中的变量(例如:Timer1控件过程调用Command2控件过程中的rl变量?
4.capCreateCaptureWindowA中的长宽数值(480*270)的单位是什么?

想要实现的效果:检测用户点选监控中固定点的RGB值,监控为摄像头实录图像,RGB值随着图像变化而变化

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。