mirror of https://github.com/qwqdanchun/DcRat.git
102 lines
3.6 KiB
C#
102 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.InteropServices.ComTypes;
|
|
using System.Drawing;
|
|
|
|
namespace Client.Helper
|
|
{
|
|
class Camera
|
|
{
|
|
public static bool havecamera()
|
|
{
|
|
string[] devices = FindDevices();
|
|
if (devices.Length == 0)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public static readonly Guid CLSID_VideoInputDeviceCategory = new Guid("{860BB310-5D01-11d0-BD3B-00A0C911CE86}");
|
|
public static readonly Guid CLSID_SystemDeviceEnum = new Guid("{62BE5D10-60EB-11d0-BD3B-00A0C911CE86}");
|
|
public static readonly Guid IID_IPropertyBag = new Guid("{55272A00-42CB-11CE-8135-00AA004BB851}");
|
|
public static string[] FindDevices()
|
|
{
|
|
return GetFiltes(CLSID_VideoInputDeviceCategory).ToArray();
|
|
}
|
|
|
|
public static List<string> GetFiltes(Guid category)
|
|
{
|
|
var result = new List<string>();
|
|
EnumMonikers(category, (moniker, prop) =>
|
|
{
|
|
object value = null;
|
|
prop.Read("FriendlyName", ref value, 0);
|
|
var name = (string)value;
|
|
result.Add(name);
|
|
return false;
|
|
});
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
private static void EnumMonikers(Guid category, Func<IMoniker, IPropertyBag, bool> func)
|
|
{
|
|
IEnumMoniker enumerator = null;
|
|
ICreateDevEnum device = null;
|
|
|
|
try
|
|
{
|
|
device = (ICreateDevEnum)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SystemDeviceEnum));
|
|
device.CreateClassEnumerator(ref category, ref enumerator, 0);
|
|
if (enumerator == null) return;
|
|
var monikers = new IMoniker[1];
|
|
var fetched = IntPtr.Zero;
|
|
|
|
while (enumerator.Next(monikers.Length, monikers, fetched) == 0)
|
|
{
|
|
var moniker = monikers[0];
|
|
object value = null;
|
|
Guid guid = IID_IPropertyBag;
|
|
moniker.BindToStorage(null, null, ref guid, out value);
|
|
var prop = (IPropertyBag)value;
|
|
try
|
|
{
|
|
var rc = func(moniker, prop);
|
|
if (rc == true) break;
|
|
}
|
|
finally
|
|
{
|
|
Marshal.ReleaseComObject(prop);
|
|
if (moniker != null) Marshal.ReleaseComObject(moniker);
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
if (enumerator != null) Marshal.ReleaseComObject(enumerator);
|
|
if (device != null) Marshal.ReleaseComObject(device);
|
|
}
|
|
}
|
|
[ComVisible(true), ComImport(), Guid("29840822-5B84-11D0-BD3B-00A0C911CE86"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
|
public interface ICreateDevEnum
|
|
{
|
|
int CreateClassEnumerator([In] ref Guid pType, [In, Out] ref IEnumMoniker ppEnumMoniker, [In] int dwFlags);
|
|
}
|
|
|
|
[ComVisible(true), ComImport(), Guid("55272A00-42CB-11CE-8135-00AA004BB851"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
|
|
public interface IPropertyBag
|
|
{
|
|
int Read([MarshalAs(UnmanagedType.LPWStr)] string PropName, ref object Var, int ErrorLog);
|
|
int Write(string PropName, ref object Var);
|
|
}
|
|
}
|
|
}
|