所以看到很多人有同样的问题,但没有答案。我的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
}
}
所以问题又是 - 如何停止出现“视频源”对话框?
答案 0 :(得分:3)
我开发了一个表单,在Windows XP上使用avicap32显示两个实时捕获。我在案件中找到的修复手段也有可能适用于你的。
对于avicap,可以通过编程方式管理您的网络摄像头,以及所有基于注册表的网络摄像头。这是the thread我找到了引导我并实现我想要的目标。
在此主题中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MediaResources\msvideo\MSVideo.VFWWDM\DevicePath
注册表项的角色会突出显示,以便选择活动的网络摄像头。
这可能是一个有用的信息:我必须设置小写的值,以避免弹出视频源对话框。
我是通过使用SendMessage
调用WM_CAP_CONNECT
之前和之后监控注册表项来确定的。
据我所知(和谷歌搜索),没有其他人提供修复,所以即使我可能会回答一点,如果你能告诉我们它是否也适合你,那将是很好的。 / p>
答案 1 :(得分: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
(可能是几次)..那就是它......没有更多的视频源对话
答案 2 :(得分: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
答案 3 :(得分:0)
我有同样的问题。确保在不再需要网络摄像头时调用capDriverDisconnect。请注意,我使用的是Logitech C110,但我认为它也适用于您的情况。
答案 4 :(得分:0)
来到这里寻找&#34; WM_CAP_DRIVER_CONNECT&#34;的解决方案。和&#34;视频设置&#34;对话框弹出错误。
找到解决方案:
这是一个司机问题。使用OEM的驱动程序,因为通用Microsoft驱动程序不适用于您的相机。
使用www.astra32.com查找USB摄像头的设备信息:制造商或型号;然后google找到正确的驱动程序。
祝你好运!