如何在使用MediaEncode捕获桌面时指定屏幕区域

来源:互联网 发布:linux 查看ddos攻击 编辑:程序博客网 时间:2024/05/12 20:17

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

From:http://topic.csdn.net/t/20060714/17/4881322.html