1

所以已经看到很多人有同样的问题但没有答案。我的 SendMessage 在带有一个摄像头的 Windows 7 笔记本电脑上弹出“视频源”对话框。我已安装 Cyber​​ Link YouCam。 “视频源”对话框

如果我卸载 Cyber​​ Link YouCam,“视频源”对话框就会消失。似乎操作系统的行为就好像 YouCam 是同一设备的第二个驱动程序。我的问题是如何阻止“视频源”对话框出现?一旦我在对话框中选择了一个选项,我就没有得到对话框(直到我重新启动应用程序),所以必须在某处设置一个设置。

虽然调试发现这段代码(见下面的整个部分)似乎是调用对话框的那个 - SendMessage (deviceHandle, WM_CAP_CONNECT, deviceno, ((IntPtr) 0).ToInt32 ())

 public void StartWebCam (int height, int width, int handleofthepicturebox, int deviceno)
        {

        string deviceIndex = "" + deviceno;

        deviceHandle = capCreateCaptureWindowA (ref deviceIndex, WS_VISIBLE | WS_CHILD, 0, 0, width, height, handleofthepicturebox, 0);


        if (SendMessage (deviceHandle, WM_CAP_CONNECT, deviceno, ((IntPtr) 0).ToInt32 ()) > 0)
            {


            SendMessage (deviceHandle, WM_CAP_SET_SCALE, -1, 0);
            SendMessage (deviceHandle, WM_CAP_SET_PREVIEWRATE, 0x42, 0);
            SendMessage (deviceHandle, WM_CAP_SET_PREVIEW, -1, 0);

            }
        else
            {
            // nothing failed maybe some clean up needed
            }

        }

所以问题又是 - 我如何阻止“视频源”对话框出现?

4

5 回答 5

3

我开发了一个表单来在 Windows XP 上使用 avicap32 显示两个实时捕获。我在我的案例中找到的修复有可能也适用于你的。

在 avicap 的情况下,可以以编程方式管理您的网络摄像头,所有这些都是基于注册表的。这是我发现的线索,可以指导我并实现我想要的。

在此线程中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MediaResources\msvideo\MSVideo.VFWWDM\DevicePath突出显示了注册表项的作用,以选择活动的网络摄像头。

这可能是一条有用的信息:我必须将值设置为小写以避免弹出视频源对话框。

SendMessage我通过在调用with之前和之后监视注册表项来确定它WM_CAP_CONNECT

据我所知(和谷歌搜索),没有其他人提供修复,所以即使我可能回答得有点晚,如果你能告诉我们它是否也对你有用,那就太好了。

于 2013-01-10T13:55:07.250 回答
1

最后我找到了解决方案。
问题发生在 Windows 7 / 8

首先你需要这个API函数

Private Declare Function GetTickCount Lib "kernel32" () As Long

然后......在你打电话后capCreateCaptureWindowA()你必须等待1秒处理事件,(注意:睡眠不一样)

IniTime = GetTickCount()
While GetTickCount() < (IniTime + 1000)
   DoEvents
Wend

然后你打电话WM_CAP_DRIVER_CONNECT(也许几次)......就是这样......没有更多的视频源对话框

于 2014-10-02T22:12:27.293 回答
1

使用此解决方案,它可以完美运行。GetTickCount()等待事件与调用函数一起工作,直到它返回 true 。

Private Sub PreviewVideo(ByVal pbCtrl As PictureBox)    
    hWnd = capCreateCaptureWindowA(VideoSource, WS_VISIBLE Or WS_CHILD, 0, 0, 0,
   0, pbCtrl.Handle.ToInt64, 0)    
    Dim IniTime As Long = GetTickCount() 
    While GetTickCount() < (IniTime + 1000)
        Application.DoEvents()
    End While    
    Dim OKAnswer As Boolean = False
    For xretries As Integer = 1 To 10
          ' I'll give you Only 10 tries to connect, otherwise I AM LEAVING MICROSOFT!
          OKAnswer = SendMessage(hWnd, WM_CAP_DRIVER_CONNECT, VideoSource, 0)
          If OKAnswer Then
              Exit For
          End If    
    Next    
    If okanswer Then
          SendMessage(hWnd, WM_CAP_SET_SCALE, True, 0)
          SendMessage(hWnd, WM_CAP_SET_PREVIEWRATE, 30, 0)
          SendMessage(hWnd, WM_CAP_SET_PREVIEW, True, 0)
          SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, pbCtrl.Width, pbCtrl.Height, SWP_NOMOVE Or SWP_NOZORDER)    
    Else
          DestroyWindow(hWnd)    
    End If    
End Sub
于 2015-06-12T02:00:06.637 回答
0

我遇到过同样的问题。一旦不再需要网络摄像头,请确保调用 capDriverDisconnect。请注意,我使用的是 Logitech C110,但我想它也应该适用于您的情况。

于 2013-06-17T09:43:52.927 回答
0

来到这里寻找“WM_CAP_DRIVER_CONNECT”和“视频设置”对话框弹出错误的解决方案。

找到解决方案:

是驱动问题。使用 OEM 的驱动程序,因为通用 Microsoft 驱动程序不适用于您的相机。

使用 www.astra32.com 查找 USB 摄像头的设备信息:制造商或型号;然后谷歌搜索正确的驱动程序。

祝你好运!

于 2017-07-19T18:53:09.357 回答