private int hCaptureM;
private bool isUnload = false;
public ClassVideoCapture()
{
}
~ClassVideoCapture()
{
if (!isUnload)
{
this.UnLoad();
}
}
[DllImport("avicap32.dll")]
private static extern int capCreateCaptureWindow(string strWindowName, int dwStyle, int x, int y, int width, int height, int hwdParent, int nID);
[DllImport("user32.dll")]
private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int SendMessage(int hwnd, int wMsg, int wParam, string lPara);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(int hObject);//我记得在这种动态链接库中的方法名是不能够乱写的,好像,方法名都是已经存在的哦!这真的就是数据库么只怕是系统文件吧
public bool Initialize(Control aContainer,int intWidth,int intHeight)
{
hCaptureM = capCreateCaptureWindow("", 0x40000000 | 0x10000000, 0, 0, intWidth, intHeight, aContainer.Handle.ToInt32(), 1);
if (hCaptureM == 0)
{
return false;
}
int ret = SendMessage(hCaptureM, 1034, 0, 0);
if (ret == 0)
{
CloseHandle(hCaptureM);
return false;
}
ret = SendMessage(hCaptureM, 1074, 1, 0);
if (ret == 0)
{
this.UnLoad();
return false;
}
ret = SendMessage(hCaptureM, 1077, 1, 0);
if (ret == 0)
{
this.UnLoad();
return false;
}
//WM_CAP_SET_PREVIEWRATE
ret = SendMessage(hCaptureM, 1076, 66, 0);
if (ret == 0)
{
this.UnLoad();
return false;
}
return true;
}
private void UnLoad()
{
int ret = SendMessage(hCaptureM, 1035, 0, 0);
CloseHandle(this.hCaptureM);
isUnload = true;
}
public void SingleFramBegin()
{
int ret = SendMessage(hCaptureM, 1094, 0, 0);
}
public void SingleFramEnd()
{
int ret = SendMessage(hCaptureM, 1095, 0, 0);
}
public void SingleFramMode()
{
int ret = SendMessage(hCaptureM, 1084, 0, 0);
}
public void PreViewMode()
{
int ret=SendMessage(hCaptureM,1074,1,0);
}
public void CopyToClipBoard()
{
int ret = SendMessage(hCaptureM, 1054, 0, 0);
}
public void ShowFormatDialog()
{
int ret = SendMessage(hCaptureM, 1065, 0, 0);
}
public void SaveToDIB(string fileName)
{
int ret = SendMessage(hCaptureM,1049,0,fileName);
}
public void ShowDisplayDialog()
{
int ret = SendMessage(hCaptureM, 1067, 0, 0);
}
public System.Drawing.Image getCaptureImage()
{
System.Windows.Forms.IDataObject Idata = System.Windows.Forms.Clipboard.GetDataObject();//原来是从剪切板里获取的数据啊
System.Drawing.Image retImage = null;
if (Idata != null)
{
if (Idata.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap))
{
retImage = (System.Drawing.Image)Idata.GetData(System.Windows.Forms.DataFormats.Bitmap);
}
else if (Idata.GetDataPresent(System.Windows.Forms.DataFormats.Dib))
{
retImage = (System.Drawing.Image)Idata.GetData(System.Windows.Forms.DataFormats.Dib);
}
}
return retImage;
}
窗口加载的时候把Initialize方法驱动起来。
保存的时候将调用copy到剪切板方法,
让后在从剪切板获得数据转换成图片,也即是调用getCaptureImage方法
最后保存就行了
保存可用一下代码实现:
image.save(路径,格式);
路径可用程序启动路径比较方便。
如:Application.StartUpPath
好了,这样一个带有保存功能的摄像头驱动程序就完成了,不过这里保存的是图片,如过能保存成视频的话就更好了
这样也好,保存成图片,如果用来发送的话,会比较方便吧