积极答复者
想用c#程序设计控制笔记本摄像头,代码编译通过,运行不报错,就是没有效果

问题
-
代码都是直接拷贝网上流传的c# 摄像头编程。
摄像头类:
public class Cams
{
[DllImport("avicap32.dll")]
public static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
[DllImport("avicap32.dll")]
public static extern bool capGetDriverDescriptionA(short wDriver, byte[] lpszName, int cbName, byte[] lpszVer, int cbVer);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, int lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, short wParam, FrameEventHandler lParam);
[DllImport("User32.dll")]
public static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, ref BITMAPINFO lParam);
[DllImport("User32.dll")]
public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
[DllImport("avicap32.dll")]
public static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);// Constants
public const int WM_USER = 0x400;
public const int WS_CHILD = 0x40000000;
public const int WS_VISIBLE = 0x10000000;
public const int SWP_NOMOVE = 0x2;
public const int SWP_NOZORDER = 0x4;
public const int WM_CAP_DRIVER_CONNECT = WM_USER + 10;
public const int WM_CAP_DRIVER_DISCONNECT = WM_USER + 11;
public const int WM_CAP_SET_CALLBACK_FRAME = WM_USER + 5;
public const int WM_CAP_SET_PREVIEW = WM_USER + 50;
public const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;
public const int WM_CAP_SET_VIDEOFORMAT = WM_USER + 45;// Structures
[StructLayout(LayoutKind.Sequential)]
public struct VIDEOHDR
{
[MarshalAs(UnmanagedType.I4)]
public int lpData;
[MarshalAs(UnmanagedType.I4)]
public int dwBufferLength;
[MarshalAs(UnmanagedType.I4)]
public int dwBytesUsed;
[MarshalAs(UnmanagedType.I4)]
public int dwTimeCaptured;
[MarshalAs(UnmanagedType.I4)]
public int dwUser;
[MarshalAs(UnmanagedType.I4)]
public int dwFlags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] dwReserved;
}[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
[MarshalAs(UnmanagedType.I4)]
public Int32 biSize;
[MarshalAs(UnmanagedType.I4)]
public Int32 biWidth;
[MarshalAs(UnmanagedType.I4)]
public Int32 biHeight;
[MarshalAs(UnmanagedType.I2)]
public short biPlanes;
[MarshalAs(UnmanagedType.I2)]
public short biBitCount;
[MarshalAs(UnmanagedType.I4)]
public Int32 biCompression;
[MarshalAs(UnmanagedType.I4)]
public Int32 biSizeImage;
[MarshalAs(UnmanagedType.I4)]
public Int32 biXPelsPerMeter;
[MarshalAs(UnmanagedType.I4)]
public Int32 biYPelsPerMeter;
[MarshalAs(UnmanagedType.I4)]
public Int32 biClrUsed;
[MarshalAs(UnmanagedType.I4)]
public Int32 biClrImportant;
}[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
[MarshalAs(UnmanagedType.Struct, SizeConst = 40)]
public BITMAPINFOHEADER bmiHeader;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public Int32[] bmiColors;
}public delegate void FrameEventHandler(IntPtr lwnd, IntPtr lpVHdr);// Public methods
public static object GetStructure(IntPtr ptr, ValueType structure)
{
return Marshal.PtrToStructure(ptr, structure.GetType());
}public static object GetStructure(int ptr, ValueType structure)
{
return GetStructure(new IntPtr(ptr), structure);
}public static void Copy(IntPtr ptr, byte[] data)
{
Marshal.Copy(ptr, data, 0, data.Length);
}public static void Copy(int ptr, byte[] data)
{
Copy(new IntPtr(ptr), data);
}public static int SizeOf(object structure)
{
return Marshal.SizeOf(structure);
}
}摄像头操作类:
class CamsController
{
// delegate for frame callback
public delegate void RecievedFrameEventHandler(byte[] data);
public event RecievedFrameEventHandler RecievedFrame;private IntPtr lwndC; // Holds the unmanaged handle of the control
private IntPtr mControlPtr; // Holds the managed pointer of the control
private int mWidth;
private int mHeight;
private Cams.FrameEventHandler mFrameEventHandler;public CamsController(IntPtr handle, int width, int height)
{
mControlPtr = handle;
mWidth = width;
mHeight = height;
}// private functions
private bool capDriverConnect(IntPtr lwnd, short i)
{
return Cams.SendMessage(lwnd, Cams.WM_CAP_DRIVER_CONNECT, i, 0);
}
private bool capDriverDisconnect(IntPtr lwnd)
{
return Cams.SendMessage(lwnd, Cams.WM_CAP_DRIVER_DISCONNECT, 0, 0);
}
private bool capPreview(IntPtr lwnd, bool f)
{ return Cams.SendMessage(lwnd, Cams.WM_CAP_SET_PREVIEW, f, 0); }private bool capPreviewRate(IntPtr lwnd, short wMS)
{
return Cams.SendMessage(lwnd, Cams.WM_CAP_SET_PREVIEWRATE, wMS, 0);
}private bool capSetCallbackOnFrame(IntPtr lwnd, Cams.FrameEventHandler lpProc)
{
return Cams.SendMessage(lwnd, Cams.WM_CAP_SET_CALLBACK_FRAME, 0, lpProc);
}private bool capSetVideoFormat(IntPtr hCapWnd, ref Cams.BITMAPINFO BmpFormat, int CapFormatSize)
{
return Cams.SendMessage(hCapWnd, Cams.WM_CAP_SET_VIDEOFORMAT, CapFormatSize, ref BmpFormat);
}private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
{
Cams.VIDEOHDR videoHeader = new Cams.VIDEOHDR();
byte[] VideoData;
videoHeader = (Cams.VIDEOHDR)Cams.GetStructure(lpVHdr, videoHeader);
VideoData = new byte[videoHeader.dwBytesUsed];
Cams.Copy(videoHeader.lpData, VideoData);
if (this.RecievedFrame != null)
this.RecievedFrame(VideoData);
}public void StartCam()
{
byte[] lpszName = new byte[100];
byte[] lpszVer = new byte[100];Cams.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);
this.lwndC = Cams.capCreateCaptureWindowA(lpszName, Cams.WS_VISIBLE + Cams.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);if (this.capDriverConnect(this.lwndC, 0))//这里往设备发送开启信号无反应
{
this.capPreviewRate(this.lwndC, 66);
this.capPreview(this.lwndC, true);
Cams.BITMAPINFO bitmapinfo = new Cams.BITMAPINFO();
bitmapinfo.bmiHeader.biSize = Cams.SizeOf(bitmapinfo.bmiHeader);
bitmapinfo.bmiHeader.biWidth = 352;
bitmapinfo.bmiHeader.biHeight = 288;
bitmapinfo.bmiHeader.biPlanes = 1;
bitmapinfo.bmiHeader.biBitCount = 24;
this.capSetVideoFormat(this.lwndC, ref bitmapinfo, Cams.SizeOf(bitmapinfo));
this.mFrameEventHandler = new Cams.FrameEventHandler(FrameCallBack);
this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);
Cams.SetWindowPos(this.lwndC, 0, 0, 0, mWidth, mHeight, 6);
}
}public void CloseCams()
{
this.capDriverDisconnect(this.lwndC);
}
}加粗下划线的位置就是问题所在,代码跳到那个位置,往设备发生信息,但是返回结果为否,然后摄像头返回黑幕,求达人帮忙分析一下啊
傻
答案
-
你好,
这是所有的代码了吗?
首先要确定的是代码中是否存在Try...catch的语句将某些exception给吃掉了。
其次代码运行到那里没有反应并不代表程序在那边出了错误,请通过VS上的堆栈操作确定到底那边出错了
- 已标记为答案 Bob ShenModerator 2012年5月17日 8:11
全部回复
-
你好,
这是所有的代码了吗?
首先要确定的是代码中是否存在Try...catch的语句将某些exception给吃掉了。
其次代码运行到那里没有反应并不代表程序在那边出了错误,请通过VS上的堆栈操作确定到底那边出错了
- 已标记为答案 Bob ShenModerator 2012年5月17日 8:11
-
建议使用F5 调试一下,到这段 将出错信息发布来。方便解决你所遇到的问题
爱吃西瓜的小强[mcpd]
- 已建议为答案 Kangqiang Hua 2012年5月10日 7:06
- 已编辑 Kangqiang Hua 2012年5月10日 7:06
- 已标记为答案 Bob ShenModerator 2012年5月17日 8:11
- 取消答案标记 大傻佬 2012年5月29日 7:01