如何在使用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
- 如何在使用MediaEncode捕获桌面时指定屏幕区域
- 如何使用MindMapper屏幕捕获功能
- 截屏/截取屏幕指定区域
- 捕获图片,捕获桌面屏幕,然后存储到文件中
- 如何在指定的内存区域 new 一个对象
- iOS 如何判断一个点在某个指定区域中
- c#屏幕打印/用户指定区域打印
- 如何判断指定dom元素是否在屏幕内
- QPainterPath在指定区域绘图
- VC屏幕截图(将屏幕指定区域存成图片)
- 如何使用glide在加载成功图片时,截取屏幕
- 桌面捕获
- 如何在使用ActiveX时通过Param指定属性值
- 如何在 Linux 中使用屏幕键盘
- 如何获取word可编辑区域在屏幕上的坐标
- 如何简单调整屏幕显示区域
- 如何判断鼠标按下的点是否在指定矩形区域CRect
- MFC中如何在指定的区域响应鼠标单击事件?
- _beginthread还是CreateThread
- 被问到的一个问题:Linux是实时操作系统吗?
- 基于xfire的web service搭建
- 数据中心内涵转变
- GPS经纬度的表示
- 如何在使用MediaEncode捕获桌面时指定屏幕区域
- 浅谈测试web程序的几大要点
- 2009-07-21,暑期拔高,第五天
- 今天使用了visual assist
- 浅谈java.util.Vector类的add()和addAll()方法
- yaffs2应用到较老版本linux上时的问题 (移植日记)
- static静态变量的理解
- 用回车键触发一个按钮的单击事件
- 国际化开发技术FAQ