C#程序调用摄像头总是弹出视频源,跪求大神解答

qq_26763017 2015-04-14 01:59:23
RT,网上有人说是线程阻塞问题,但是我没有开启与摄像头相关的任何程序呀!表示不懂为啥会这样。点打开摄像头就会跳出视频源窗口
代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace video
{
public class VideoWork
{
private const int WM_USER = 0x400;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int WM_CAP_START = WM_USER;
private const int WM_CAP_STOP = WM_CAP_START + 68;
private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
private IntPtr hWndC;
private bool bWorkStart = false;
private IntPtr mControlPtr;
private int mWidth;
private int mHeight;
private int mLeft;
private int mTop;

/// <summary>
/// 初始化显示图像
/// </summary>
/// <param name= “handle “> 控件的句柄 </param>
/// <param name= “left “> 开始显示的左边距 </param>
/// <param name= “top “> 开始显示的上边距 </param>
/// <param name= “width “> 要显示的宽度 </param>
/// <param name= “height “> 要显示的长度 </param>
public VideoWork(IntPtr handle, int left, int top, int width, int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
mLeft = left;
mTop = top;
}

[DllImport("avicap32.dll ")]
private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);

[DllImport("avicap32.dll ")]
private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);

//
//这里特别注意,因为WinAPI中的long为32位,而C#中的long为64wei,所以需要将lParam该为int
//
[DllImport("User32.dll ")]
private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);

/// <summary>
/// 开始显示图像
/// </summary>
public void Start()
{
if (bWorkStart)
return;

bWorkStart = true;
byte[] lpszName = new byte[100];

hWndC = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);

if (hWndC.ToInt32() != 0)
{
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
//Global.log.Write( “SendMessage “);
}
return;

}

/// <summary>
/// 停止显示
/// </summary>
public void Stop()
{
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
bWorkStart = false;
}

/// <summary>
/// 抓图
/// </summary>
/// <param name= “path “> 要保存bmp文件的路径 </param>
public void GrabImage(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt32());
}
/// <summary>
/// 录像
/// </summary>
/// <param name="path">要保存avi文件的路径</param>
public void Kinescope(string path)
{
IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);

SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());

SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);

}

/// <summary>
/// 停止录像
/// </summary>
public void StopKinescope()
{
SendMessage(hWndC, WM_CAP_STOP, 0, 0);
}

}
}







using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing.Imaging;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.IO;
using AForge;
using AForge.Controls;
using AForge.Video;
using AForge.Video.DirectShow;
using Size = System.Drawing.Size;
using video;

namespace video
{
public partial class Form1 : Form
{
private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;
public Form1()
{
InitializeComponent();
}

VideoWork wv;
private void button1_Click(object sender, EventArgs e)
{
//VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString);
//videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240);
//videoSource.DesiredFrameRate = 1;
wv = new VideoWork(this.panel1.Handle, 0, 0, this.panel1.Width, panel1.Height);
wv.Start();
wv.Start();
}

private void button2_Click(object sender, EventArgs e)
{
string path=@"c:\1.bmp";
wv.GrabImage(path);

}

private void Form1_Load(object sender, EventArgs e)
{
try
{
// 枚举所有视频输入设备
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

if (videoDevices.Count == 0)
throw new ApplicationException();

foreach (FilterInfo device in videoDevices)
{
tscbxCameras.Items.Add(device.Name);
}

tscbxCameras.SelectedIndex = 0;

}
catch (ApplicationException)
{
tscbxCameras.Items.Add("No local capture devices");
videoDevices = null;
}
}

private void button3_Click(object sender, EventArgs e)
{
if (button3.Text=="录像")
{
string path = @"c:\2.avi";
wv.Kinescope(path);
button3.Text = "停止";
}
else
{
wv.StopKinescope();
}

}

private void panel1_Paint(object sender, PaintEventArgs e)
{

}

}

}
...全文
253 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26763017 2015-04-14
  • 打赏
  • 举报
回复
引用 5 楼 huiyaosoft 的回复:
以管理员身份运行程序或者通过代码指定视频源?
我想问下,我的代码是哪里出错了吗?
huiyaosoft 2015-04-14
  • 打赏
  • 举报
回复
以管理员身份运行程序或者通过代码指定视频源?
qq_26763017 2015-04-14
  • 打赏
  • 举报
回复
引用 2 楼 wyd1520 的回复:
wv.Start(); wv.Start();
我试过注释掉一个 还是那样
qq_26763017 2015-04-14
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
wv = new VideoWork(this.panel1.Handle, 0, 0, this.panel1.Width, panel1.Height); wv.Start(); wv.Start(); 连续2个start,真的大丈夫?
但是我试过注释掉了一个 还是那样
本拉灯 2015-04-14
  • 打赏
  • 举报
回复
wv.Start(); wv.Start();
於黾 2015-04-14
  • 打赏
  • 举报
回复
wv = new VideoWork(this.panel1.Handle, 0, 0, this.panel1.Width, panel1.Height); wv.Start(); wv.Start(); 连续2个start,真的大丈夫?

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧