有人用过VedioCapture类吗?就是c#下的视频采集类,挺好用的,可是我现在发现多线程下似乎无法获取图片,
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace ReboundServer
{
///
/// VedioCapture 的摘要说明。
///
public class VedioCapture
{
private int hCaptureM;
private bool isUnLoad = false; public VedioCapture ()
{
} [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 lParam);
[DllImport("Kernel32.dll")]
private static extern bool CloseHandle(int hObject); public bool Initialize(System.Windows.Forms.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;
}
//WM_CAP_SET_PREVIEW
ret = SendMessage(hCaptureM, 1074, 1, 0);
if (ret == 0)
{
this.UnLoad();
return false;
}
//WM_CAP_SET_SCALE
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;
} public void SingleFrameBegin()
{
//
int ret = SendMessage(hCaptureM, 1094, 0, 0);
} public void SingleFrameEnd()
{
//
int ret = SendMessage(hCaptureM, 1095, 0, 0);
} public void SingleFrameMode()
{
//WM_CAP_GRAB_FRAME
int ret = SendMessage(hCaptureM, 1084, 0, 0);
//WM_CAP_SET_PREVIEW
//int ret = SendMessage( hCaptureM, 1074 , 0, 0 );
//WM_CAP_SINGLE_FRAME
//ret = SendMessage( hCaptureM, 1096 , 0, 0 );
} public void PreviewMode()
{
int ret = SendMessage(hCaptureM, 1074, 1, 0);
} public void UnLoad()
{
int ret = SendMessage(hCaptureM, 1035, 0, 0);
CloseHandle(this.hCaptureM);
isUnLoad = true;
} public void CopyToClipBorad()
{
int ret = SendMessage(hCaptureM, 1054, 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;
}
~AVG()
{
if (!isUnLoad)
{
this.UnLoad();
}
}
}
}
在windows程序中直接调用一切正常,可是我想通过多线程进行截取pictureBox上的图片时没有办法截取到getCaptureImage函数中始终无法得到Clipboard上的数据,请问这是怎么回事,有办法解决吗?望请达人帮忙解答
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace ReboundServer
{
///
/// VedioCapture 的摘要说明。
///
public class VedioCapture
{
private int hCaptureM;
private bool isUnLoad = false; public VedioCapture ()
{
} [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 lParam);
[DllImport("Kernel32.dll")]
private static extern bool CloseHandle(int hObject); public bool Initialize(System.Windows.Forms.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;
}
//WM_CAP_SET_PREVIEW
ret = SendMessage(hCaptureM, 1074, 1, 0);
if (ret == 0)
{
this.UnLoad();
return false;
}
//WM_CAP_SET_SCALE
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;
} public void SingleFrameBegin()
{
//
int ret = SendMessage(hCaptureM, 1094, 0, 0);
} public void SingleFrameEnd()
{
//
int ret = SendMessage(hCaptureM, 1095, 0, 0);
} public void SingleFrameMode()
{
//WM_CAP_GRAB_FRAME
int ret = SendMessage(hCaptureM, 1084, 0, 0);
//WM_CAP_SET_PREVIEW
//int ret = SendMessage( hCaptureM, 1074 , 0, 0 );
//WM_CAP_SINGLE_FRAME
//ret = SendMessage( hCaptureM, 1096 , 0, 0 );
} public void PreviewMode()
{
int ret = SendMessage(hCaptureM, 1074, 1, 0);
} public void UnLoad()
{
int ret = SendMessage(hCaptureM, 1035, 0, 0);
CloseHandle(this.hCaptureM);
isUnLoad = true;
} public void CopyToClipBorad()
{
int ret = SendMessage(hCaptureM, 1054, 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;
}
~AVG()
{
if (!isUnLoad)
{
this.UnLoad();
}
}
}
}
在windows程序中直接调用一切正常,可是我想通过多线程进行截取pictureBox上的图片时没有办法截取到getCaptureImage函数中始终无法得到Clipboard上的数据,请问这是怎么回事,有办法解决吗?望请达人帮忙解答
解决方案 »
- c#(csharp)中invoke的问题,希望各位能够指点一下
- C#制作的记事本,想调用自己用HTML Help Workshop做的帮助文件,应该如何调用
- 对数据库字段进行排序问题。求高手
- 请问在VS2005里面WinForm怎么在页面中传值.. 谢谢大家帮忙....
- .Net 群
- 在程序运用appliction.doevent()有什么好处,它是不是可以提高程序运行的速度啊,一般在什么情况下运用它啊,谢谢!!!
- 急!关于做循环
- 帮我看看这段代码问题出在哪里!!!
- 请问如何锁定打开文件的路径?谢谢
- 晕。ms真的邀请我去广州国际大酒店听"数据库应用设计方法与实现"。26日。
- 为什么拖到tableLayoutPanel里的其它控件都只能自动左上角对齐啊,能不能改变他的对齐方式?
- DropDownList 可以实现多选功能吗?我想要DropDownList格式的但可以实现多选的,别的控件也可以,高手救命
int ret = SendMessage(hCaptureM, 1054, 0, 0);上
我的多线程是操作一个新的实例方法,可能像zlkingdom说的那样吧,句柄传递出现了问题
那多线程间如何传递句柄呢?