我使用C#和MediaEncode 9编写了一个屏幕捕获工具, 但是无法通过程序指定捕获的屏幕区域,
在SDK中提到是C++的代码可以使用IPropertyBag接口指定捕获的屏幕区域,请问在C#中该如何设置,
谢谢!
部分代码如下:
oSrcGrp = nSrcGrps.Add("SG_1");
oSrcAudio = (IWMEncAudioSource)
oSrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO);
oSrcVideo =(IWMEncVideoSource2)
oSrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO);
oSrcAudio.SetInput("Device://Default_Audio_Device", String.Empty , String.Empty);
oSrcVideo.SetInput("ScreenCap://ScreenCapture1" , String.Empty , String.Empty);
nProFiles = m_oWMEncoder.ProfileCollection;
Int32 dwLength = nProFiles.Count;
for(int i = 0 ; i < dwLength ; i++)
{
oCaptureProfile = nProFiles.Item(i);
if (oCaptureProfile.Name == "Screen Video/Audio High (CBR)")
{
break;
}
else
{
oCaptureProfile = null;
}
}
oSrcGrp.set_Profile(oCaptureProfile);
//C++可以通过oSrcGrp的QueryInterface方法获取IPropertyBag接口设定屏幕区域,在C#中该如何设定??
m_oWMEncoder.PrepareToEncode(true);
m_oWMEncoder.Start();
dwRtn = 0;
由于C#中的MediaEncode的对象并没有提供设置捕获屏幕区域的方法, 因此需要通过Marshal.GetIUnknownForObject方法或许IUnKnown接口的指针, 再通过GetObjectForIUnknown方法转换城IPropertyBag的接口(需要自己定义).
代码如下:
//IPropertyBag 的接口定义
[Guid("55272A00-42CB-11CE-8135-00AA004BB851")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPropertyBag
{
void Read(String propName,out object ptrVar,int errorLog);
void Write(string propName,ref object ptrVar);
}
//获取IPropertyBag的对象实例
IntPtr ptrUnk = Marshal.GetIUnknownForObject(oSrcVideo);
if (ptrUnk != IntPtr.Zero)
{
IPropertyBag oSrcPropBag = (IPropertyBag) Marshal.GetObjectForIUnknown(ptrUnk);
if (oSrcPropBag != null)
{
Object objData = null;
//不使用窗口的捕获方式
objData = (Object) false;
oSrcPropBag.Write("CaptureWindow" , ref objData);
//设置捕获的区域
objData = m_rctSrcScreenRect.Left;
oSrcPropBag.Write("Left" , ref objData);
objData = m_rctSrcScreenRect.Top;
oSrcPropBag.Write("Top" , ref objData);
objData = m_rctSrcScreenRect.Right;
oSrcPropBag.Write("Right" , ref objData);
objData = m_rctSrcScreenRect.Bottom;
oSrcPropBag.Write("Bottom" , ref objData);
//不使用整个屏幕的捕获方式
objData = (Object) false;
oSrcPropBag.Write("Screen" , ref objData);
}
Marshal.Release(ptrUnk);
}