我使用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);
}