52 lines
1.8 KiB
C#
52 lines
1.8 KiB
C#
|
using System.Runtime.InteropServices;
|
||
|
using System.Runtime.InteropServices.ComTypes;
|
||
|
using DirectShowLib;
|
||
|
|
||
|
namespace DualScreenDemo
|
||
|
{
|
||
|
public class FilterEnumerator
|
||
|
{
|
||
|
private static readonly Guid IID_IPropertyBag = new Guid("55272A00-42CB-11CE-8135-00AA004BB851");
|
||
|
|
||
|
public void EnumerateFilters()
|
||
|
{
|
||
|
ICreateDevEnum createDevEnum = (ICreateDevEnum)new CreateDevEnum();
|
||
|
IEnumMoniker enumMoniker;
|
||
|
int hr = createDevEnum.CreateClassEnumerator(FilterCategory.LegacyAmFilterCategory, out enumMoniker, 0);
|
||
|
if (hr != 0 || enumMoniker == null)
|
||
|
{
|
||
|
Console.WriteLine("No filters found.");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
IMoniker[] monikers = new IMoniker[1];
|
||
|
IntPtr fetched = Marshal.AllocHGlobal(sizeof(int));
|
||
|
while (enumMoniker.Next(1, monikers, fetched) == 0)
|
||
|
{
|
||
|
int fetchedCount = Marshal.ReadInt32(fetched);
|
||
|
if (fetchedCount > 0)
|
||
|
{
|
||
|
object objPropBag;
|
||
|
Guid tempGuid = IID_IPropertyBag;
|
||
|
monikers[0].BindToStorage(null, null, ref tempGuid, out objPropBag);
|
||
|
IPropertyBag propBag = objPropBag as IPropertyBag;
|
||
|
|
||
|
object filterName = null;
|
||
|
if (propBag != null)
|
||
|
{
|
||
|
propBag.Read("FriendlyName", out filterName, null);
|
||
|
}
|
||
|
|
||
|
if (filterName != null)
|
||
|
{
|
||
|
Console.WriteLine("Filter: " + filterName.ToString());
|
||
|
}
|
||
|
|
||
|
Marshal.ReleaseComObject(monikers[0]);
|
||
|
}
|
||
|
}
|
||
|
Marshal.ReleaseComObject(enumMoniker);
|
||
|
Marshal.FreeHGlobal(fetched);
|
||
|
}
|
||
|
}
|
||
|
}
|