我是C#的新手。我创建了一个由我的网络摄像头录制的应用程序。但我想创建一个带有摄像头设置的按钮(亮度等)。我下载了这个项目
http://www.codeproject.com/Articles/3566/DirectX-Capture-Class-Library
帮助我,但我很困惑。如果您转到PropertyPages并单击视频捕获设备,您可以更改摄像机的设置。我无法在代码中找到它如何只使用此窗口。我想点击一个按钮并显示设置。
提前谢谢你,我是C#的新手,所以不要破坏我的声誉,我知道我的问题有点困惑,但我很困惑:P!
答案 0 :(得分:0)
与您的问题相关的该项目的工作流程如下:
运行应用程序时,会运行updateMenu
方法并创建菜单中的项目。
// Load property pages
try
{
mnuPropertyPages.MenuItems.Clear();
for (int c = 0; c < capture.PropertyPages.Count; c++)
{
p = capture.PropertyPages[c];
m = new MenuItem(p.Name + "...", new EventHandler(mnuPropertyPages_Click));
mnuPropertyPages.MenuItems.Add(m);
}
mnuPropertyPages.Enabled = (capture.PropertyPages.Count > 0);
}
catch { mnuPropertyPages.Enabled = false; }
PropertyPages
是第一次调用时返回PropertyPageCollection
列表的属性,每个项目都会创建一个菜单。要查看如何创建此集合,请查看属性正文。并非过滤器图表中使用的所有过滤器都具有PropertyPages。
PropertyPageCollection
班级正在接收过滤器和graphBuilder
。在构造函数中调用addFromGraph
。此方法为每个过滤器创建DirectShowPropertyPage
并将其添加到内部的InnerList
列表中
PropertyPageCollection
。创建DirectShowPropertyPage
的代码位于addIfSupported
方法
要显示属性页面,此菜单事件将挂钩到过滤器属性页面的所有菜单项(请参阅步骤1):
private void mnuPropertyPages_Click(object sender, System.EventArgs e)
{
try
{
MenuItem m = sender as MenuItem;
capture.PropertyPages[m.Index].Show( this );
updateMenu();
}
catch (Exception ex)
{
MessageBox.Show( "Unable display property page. Please submit a bug report.\n\n" + ex.Message + "\n\n" + ex.ToString() );
}
}
这个项目正在收集你拥有的所有相机。为了达到您的目的,您可以制作自己的方法并传递视频过滤器(您正在使用的相机),过滤器的名称和属性页的父项(您的主表单)并直接显示属性页。在Capture.cs
中添加此方法,添加对using System.Windows.Forms
的引用,以防缺少。
public bool ShowPropertyPage(Control owner )
{
object filter = null;
Guid cat = PinCategory.Capture;
Guid med = MediaType.Interleaved;
Guid iid = typeof(IAMStreamConfig).GUID;
int hr = graphBuilder.FindInterface(
ref cat, ref med, videoDeviceFilter, ref iid, out filter );
if ( hr != 0 )
{
med = MediaType.Video ;
hr = graphBuilder.FindInterface(
ref cat, ref med, videoDeviceFilter, ref iid, out filter );
if ( hr != 0 )
filter = null;
}
ISpecifyPropertyPages specifyPropertyPages = null;
DsCAUUID cauuid = new DsCAUUID();
bool hasPropertyPage = false;
// Determine if the object supports the interface
// and has at least 1 property page
try
{
specifyPropertyPages = filter as ISpecifyPropertyPages;
if (specifyPropertyPages != null)
{
int hr = specifyPropertyPages.GetPages(out cauuid);
if ((hr != 0) || (cauuid.cElems <= 0))
specifyPropertyPages = null;
}
}
finally
{
if (cauuid.pElems != IntPtr.Zero)
Marshal.FreeCoTaskMem(cauuid.pElems);
}
// Add the page to the internal collection
if (specifyPropertyPages != null)
{
DirectShowPropertyPage p = new DirectShowPropertyPage(videDevice.Name, specifyPropertyPages);
p.Show(owner);
hasPropertyPage = true;
}
return (hasPropertyPage);
}
在某些按钮点击事件上调用ShowPropertyPage。您可以通过调用capture.VideoDevice
和名称capture.VideoDevice.Name
来使用Capture类的实例来获取视频过滤器。当然首先你必须选择相机才能工作,也许你需要做一些其他的检查。
private void btnShowPropertyPages_Click(object sender, System.EventArgs e)
{
try
{
if (capture == null)
throw new ApplicationException("Please select a video and/or audio device.");
capture.ShowPropertyPage(this);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n\n" + ex.ToString());
}
}