求助,C# 操作USB口的摄像头,打开时总弹出视频源对话框。

.Net技术 码拜 6年前 (2015-05-10) 693次浏览 0个评论
 

我在网上找的代码。
 if (SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) == 1)
执行到这句时会出现。选择视频源的对话框,点确定后有时可以打开摄像头有时还不好使。为什么呢?
有没有好的解决办法?
或有别的方法。请各位帮帮忙。

在网上找的代码就是很常用的哪种
using System;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
usingSystem.Runtime.InteropServices;
 
namespace WebcamMini
{
    publicpartialclassWebcam: Form
    {
        public Webcam()
        {
            InitializeComponent();
        }
        constshort WM_CAP = 1024;
        constint WM_CAP_DRIVER_CONNECT = WM_CAP + 10;
        constint WM_CAP_DRIVER_DISCONNECT = WM_CAP + 11;
        constint WM_CAP_EDIT_COPY = WM_CAP + 30;
        constint WM_CAP_SET_PREVIEW = WM_CAP + 50;
        constint WM_CAP_SET_PREVIEWRATE = WM_CAP + 52;
        constint WM_CAP_SET_SCALE = WM_CAP + 53;
        constint WS_CHILD = 1073741824;
        constint WS_VISIBLE = 268435456;
        constshort SWP_NOMOVE = 2;
        constshort SWP_NOSIZE = 1;
        constshort SWP_NOZORDER = 4;
        constshort HWND_BOTTOM = 1;
        int iDevice = 0;
        int hHwnd;
        [System.Runtime.InteropServices.DllImport(“user32”, EntryPoint = “SendMessageA”)]
        staticexternint SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)]
            object lParam);
        [System.Runtime.InteropServices.DllImport(“user32”, EntryPoint = “SetWindowPos”)]
        staticexternint SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
        [System.Runtime.InteropServices.DllImport(“user32”)]
        staticexternbool DestroyWindow(int hndw);
        [System.Runtime.InteropServices.DllImport(“avicap32.dll”)]
        staticexternint capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int x, int y, int nWidth, short nHeight, int hWndParent, int nID);
        [System.Runtime.InteropServices.DllImport(“avicap32.dll”)]
        staticexternbool capGetDriverDescriptionA(short wDriver, string lpszName, int cbName, string lpszVer, int cbVer);
        privatevoid OpenPreviewWindow()
        {
            int iHeight = 150;
            int iWidth = 150;
            //
            //  Open Preview window in picturebox
            //
            hHwnd = capCreateCaptureWindowA(iDevice.ToString(), (WS_VISIBLE | WS_CHILD), 0, 0, 640, 480, picCapture.Handle.ToInt32(), 0);
            //
            //  Connect to device
            //
            if (SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) == 1)
            {
                //
                // Set the preview scale
                //
                SendMessage(hHwnd, WM_CAP_SET_SCALE, 1, 0);
                //
                // Set the preview rate in milliseconds
                //
                SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0);
                //
                // Start previewing the image from the camera
                //
                SendMessage(hHwnd, WM_CAP_SET_PREVIEW, 1, 0);
                //
                //  Resize window to fit in picturebox
                //
                SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, iWidth, iHeight, (SWP_NOMOVE | SWP_NOZORDER));
            }
            else
            {
                //
                //  Error connecting to device close window
                // 
                DestroyWindow(hHwnd);
            }
        }
        privatevoid ClosePreviewWindow()
        {
            //
            //  Disconnect from device
            //
            SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, iDevice, 0);
            //
            //  close window
            //
            DestroyWindow(hHwnd);
        }
 
        privatevoid TakePhotos()
        {
            // TODO: ….
        }
 
        privatevoid Webcam_Load(object sender, EventArgs e)
        {
            iDevice = 0;
            OpenPreviewWindow();
    
        }
    }
}  
引用 2 楼 MSDXGLDEV 的回复:

mark。。。。。

有没有什么好办法呢?

这是一个老问题了。不知道有没有解决
什么时候的问题了。。
引用 5 楼 oh51888 的回复:

什么时候的问题了。。

我看网上也有很多这个问题。日期是以前的。

求教求教啊啊啊
没有人回答么?
引用 9 楼 kkilll1590 的回复:

不会  求学习

先顶顶,研究研究
10分
如果全是代码控制的话,结束的时候有关闭摄像头功能的代码吗?如果只是想调用摄像头,可以直接打开程序或者程序的快捷方式
10分
引用 12 楼 qiujialongjjj 的回复:

如果全是代码控制的话,结束的时候有关闭摄像头功能的代码吗?如果只是想调用摄像头,可以直接打开程序或者程序的快捷方式

这个方式 够独特,够简单。

你是不是有的时候没有释放资源,所以打不开了。

我又查了一下。知道为什么了。。是因为驱动的原因。

如果是即插即用的摄像头直接调用也好使但是不稳定。有的时候就会弹出选择视频源对话框。
有驱动的上好驱动后就不会出现问题了。。。

谢谢大家。 

20分
这个我以前也遇到过,也是用即插即用的免驱动摄像头,代码也是网上下的。开始也遇到和你一样的问题,后来我怒了,根据SendMessageA的函数原型自己重新写了Import引用方法,还把初始化摄像头获得显示控件句柄的方法移到类创建时就执行,而非在打开摄像头前。后来就再也没有问题了~
10分
用API一下
引用 15 楼 bingejesse 的回复:

这个我以前也遇到过,也是用即插即用的免驱动摄像头,代码也是网上下的。开始也遇到和你一样的问题,后来我怒了,根据SendMessageA的函数原型自己重新写了Import引用方法,还把初始化摄像头获得显示控件句柄的方法移到类创建时就执行,而非在打开摄像头前。后来就再也没有问题了~

高手。。可不可以把你写的给我发一份我学习一下。谢谢  kkilll_123@163.com

50分
其实根本不需要楼主你那么做,给你个DEMO的地址,纯C#的,不需要调用API,直接打开网络摄像头的,绝对物有所值,别忘了给点分哦!!!http://www.codesoso.com/code/Motion_Detection.aspx
来学习一下!
我也碰到这个问题了,有解决方法了吗?
偶也遇到这个问题
线程阻塞 有另一个程序也开了相同的线程 把那个线程关了就行了 
俺今年也想用C#加avicap32.dll控制USB摄像头,结果也遇到这个问题,家里穷电脑上就一个摄像头,还老弹出选择视频源的框,你说烦不烦啊。俺也没本事像15楼高手重写SendMessageA,只好另开一个线程,有findwindowEX找到选择视频源对话框,用程序模拟点确定。
基本代码是这样:  
加上定义和引用:
private const uint BM_CLICK = 0xF5; //鼠标点击的消息,对于各种消息的数值,查API手册,也可用VS2010自带的SPY++    
        [DllImport(“user32.dll”, EntryPoint = “SendMessage”, SetLastError = true, CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hwnd, uint wMsg, IntPtr wParam, int lParam);

//开个线程准备关闭对话框
 System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(closevideoprompt));
            th.Start();
//线程中关闭对话框的函数
 private void closevideoprompt()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(100);
                IntPtr hWnd = FindWindow(null, “视频源”);
                //this.textBox1.Text = hWnd.ToString() + “!”;
                //ShowWindow(hWnd, SW_RESTORE); //将窗口还原
                //SetForegroundWindow(hWnd); //如果没有ShowWindow,此方法不能设置最小化的窗口
                if (hWnd != IntPtr.Zero)
                {
                    IntPtr hwndSure = FindWindowEx(hWnd, (IntPtr)0, “Button”, “确定”); //获取确定按钮的句柄                
                    SendMessage(hwndSure, BM_CLICK, (IntPtr)0, 0); //发送单击消息           
                }
            }
        }
//6次不成功就算了
          int i = 0 , j = 0;
            while (i != 1)
            {
                i = SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0);
                System.Threading.Thread.Sleep(100);
                j++;
                if (j > 6) { MessageBox.Show(“请确认视频连接正常!”); th.Abort(); return; }
            }
勉强算解决了这个问题。就是开视频时用户还能看到视频源对话框一闪而过。

能分享吗?谢谢大哥哥
引用 15 楼 bingejesse 的回复:

这个我以前也遇到过,也是用即插即用的免驱动摄像头,代码也是网上下的。开始也遇到和你一样的问题,后来我怒了,根据SendMessageA的函数原型自己重新写了Import引用方法,还把初始化摄像头获得显示控件句柄的方法移到类创建时就执行,而非在打开摄像头前。后来就再也没有问题了~

可以给我一份解决问题的代码吗,跪求!谢谢!

引用 25 楼 zhangsanlaola 的回复:
Quote: 引用 15 楼 bingejesse 的回复:

这个我以前也遇到过,也是用即插即用的免驱动摄像头,代码也是网上下的。开始也遇到和你一样的问题,后来我怒了,根据SendMessageA的函数原型自己重新写了Import引用方法,还把初始化摄像头获得显示控件句柄的方法移到类创建时就执行,而非在打开摄像头前。后来就再也没有问题了~

可以给我一份解决问题的代码吗,跪求!谢谢!zf560@126.com

Quote: 引用 15 楼 bingejesse 的回复:
 这个我以前也遇到过,也是用即插即用的免驱动摄像头,代码也是网上下的。开始也遇到和你一样的问题,后来我怒了,根据SendMessageA的函数原型自己重新写了Import引用方法,还把初始化摄像头获得显示控件句柄的方法移到类创建时就执行,而非在打开摄像头前。后来就再也没有问题了~

可以给我一份解决问题的代码吗,跪求!谢谢!1265759912@qq.com


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求助,C# 操作USB口的摄像头,打开时总弹出视频源对话框。
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!