高手请帮忙!我使用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;

解决方案 »

  1.   

    我现在通过Marshal.QueryInterface获取了IPropertyBag接口实例的指针(Intptr), 问题是我该怎么使用这个指针来Invoke IPropertyBag的Read和Write方法呢??另: 多谢3楼的兄弟帮忙UP :)
      

  2.   

    终于搞定了, 感谢2位兄弟的支持, 在这里总结一下.由于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);
    }以上