superstar_v2/FilterEnumerator.cs
2025-04-09 10:43:09 +08:00

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);
}
}
}