/// <summary> /// フィルタ一覧の取得 /// </summary> /// <param name="category">デバイスのカテゴリ</param> /// <returns> /// 取得したフィルタ情報のコレクションを返します。 /// </returns> public static List <CxFilterInfo> GetFilterList(Guid category) { var result = new List <CxFilterInfo>(); System.Runtime.InteropServices.ComTypes.IEnumMoniker enumerator = null; ICreateDevEnum device = null; try { // ICreateDevEnum インターフェース取得. device = (ICreateDevEnum)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid(GUID.CLSID_SystemDeviceEnum))); // EnumMonikerの作成. device.CreateClassEnumerator(ref category, ref enumerator, 0); if (enumerator == null) { return(result); } // 列挙. var monikers = new System.Runtime.InteropServices.ComTypes.IMoniker[1]; var fetched = IntPtr.Zero; while (enumerator.Next(monikers.Length, monikers, fetched) == 0) { // プロパティバッグへのバインド. IPropertyBag propbag = null; { object tmp = null; Guid guid = new Guid(GUID.IID_IPropertyBag); monikers[0].BindToStorage(null, null, ref guid, out tmp); propbag = (IPropertyBag)tmp; } try { var info = new CxFilterInfo(); // 名前取得. try { object friendly_name = null; propbag.Read("FriendlyName", ref friendly_name, 0); info.Name = (string)friendly_name; } catch (Exception) { } // CLSID取得. try { object clsid = null; propbag.Read("CLSID", ref clsid, 0); info.CLSID = (string)clsid; } catch (Exception) { } // コレクションに追加. result.Add(info); } finally { // プロパティバッグの解放. Marshal.ReleaseComObject(propbag); // 列挙したモニカの解放. for (int mmm = 0; mmm < monikers.Length; mmm++) { if (monikers[mmm] != null) { Marshal.ReleaseComObject(monikers[mmm]); } monikers[mmm] = null; } } } // 同名フィルタの順番付け. for (int i = 0; i < result.Count - 1; i++) { for (int j = i + 1; j < result.Count; j++) { if (result[j].Name == result[i].Name) { result[j].Index = result[i].Index + 1; break; } } } } finally { if (enumerator != null) { Marshal.ReleaseComObject(enumerator); } if (device != null) { Marshal.ReleaseComObject(device); } } return(result); }
/// <summary> /// フィルタ生成 /// </summary> /// <param name="category">フィルタのカテゴリ</param> /// <param name="clsid">フィルタの CLSID (省略する場合は null を指定してください。)</param> /// <param name="index">指標 [0~]</param> /// <returns> /// 生成されたフィルタを返します。 /// </returns> /// <remarks> /// seealso: https://msdn.microsoft.com/en-us/library/windows/desktop/dd407292(v=vs.85).aspx <br/> /// </remarks> public static IBaseFilter CreateFilter(Guid category, string clsid, int index) { System.Runtime.InteropServices.ComTypes.IEnumMoniker enumerator = null; ICreateDevEnum device = null; try { // ICreateDevEnum インターフェース取得. device = (ICreateDevEnum)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid(GUID.CLSID_SystemDeviceEnum))); // EnumMonikerの作成. device.CreateClassEnumerator(ref category, ref enumerator, 0); // 列挙. var monikers = new System.Runtime.InteropServices.ComTypes.IMoniker[1]; IntPtr fetched = IntPtr.Zero; while (enumerator.Next(monikers.Length, monikers, fetched) == 0) { System.Runtime.InteropServices.ComTypes.IMoniker moniker = monikers[0]; // プロパティバッグへのバインド. IPropertyBag propbag = null; { object tmp = null; Guid guid = new Guid(GUID.IID_IPropertyBag); moniker.BindToStorage(null, null, ref guid, out tmp); propbag = (IPropertyBag)tmp; } try { // フィルタ名の判定. if (!string.IsNullOrEmpty(clsid)) { object tmp = null; propbag.Read("CLSID", ref tmp, 0); if ((string)tmp != clsid) { continue; } } // 指標の判定. if (index > 0) { index--; continue; } // フィルタインスタンス取得. object filter = null; { Guid guid = new Guid(GUID.IID_IBaseFilter); moniker.BindToObject(null, null, ref guid, out filter); } if (filter == null) { throw new System.NotSupportedException(); } return((IBaseFilter)filter); } finally { // プロパティバッグの解放 Marshal.ReleaseComObject(propbag); // 列挙したモニカの解放. for (int mmm = 0; mmm < monikers.Length; mmm++) { if (monikers[mmm] != null) { Marshal.ReleaseComObject(monikers[mmm]); } monikers[mmm] = null; } } } throw new System.NotSupportedException(); } finally { if (enumerator != null) { Marshal.ReleaseComObject(enumerator); } if (device != null) { Marshal.ReleaseComObject(device); } } }