如何在使用MediaEncode捕獲桌面時指定屏幕區域

 我使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章