1

我在 C# 中看到了很多用于网络摄像头的库。但是有两个普遍的问题:

  1. 他们使用剪贴板,这也消除了用户使用剪贴板的能力。
  2. 除了“拍摄测试照片”外,没有其他方法可以检测网络摄像头是否已连接,这可能会刺激用户,因为网络摄像头会闪烁。

有没有办法解决这两个问题中的任何一个?

到目前为止,这是我的课:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WebcamLibrary
{
    public static class Webcam
    {
        private static IntPtr Handle;

        public static void Start()
        {
            try
            {
                Stop();
                Handle = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 0, 0);
                SendMessage(Handle, 1034, 0, 0);
                SendMessage(Handle, 1074, 0, 0);
            }
            catch { }
        }
        public static void Stop()
        {
            try
            {
                SendMessage(Handle, 1035, 0, 0);
                Clipboard.Clear();
            }
            catch { }
        }
        public static Image CaptureFrame()
        {
            try
            {
                SendMessage(Handle, 1084, 0, 0);
                SendMessage(Handle, 1054, 0, 0);
                Image image = (Image)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);
                Clipboard.Clear();
                return image;
            }
            catch
            {
                return null;
            }
        }

        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
        [DllImport("avicap32.dll")]
        private static extern IntPtr capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);
    }
}
4

1 回答 1

3

VfW 捕获 API非常有限,但允许您枚举设备连接到特定设备并将数据捕获到内存缓冲区中。

然而,它非常古老,大约 10 年前被 WDM 和 DirectShow 淘汰,也可以从 C# 中使用。

我手头没有代码,但您创建了一个过滤器图,添加了网络摄像头设备并告诉它渲染图钉。

于 2012-05-01T12:57:56.403 回答