Click here to Skip to main content
15,895,011 members
Articles / Programming Languages / C#

Intelligent Screen Saver

Rate me:
Please Sign up or sign in to vote.
3.87/5 (17 votes)
15 Aug 2007CPOL2 min read 184K   10.9K   111  
A utility to control screen saver on your computer using computer vision (human face detection), rather than idle timer.
namespace dshow
{
	using System;
	using System.Collections;
	using System.Runtime.InteropServices;
	using dshow.Core;

	/// <summary>
	/// Summary description for FilterCollection.
	/// </summary>
	internal class FilterCollection : CollectionBase
	{
		internal FilterCollection(Guid category)
		{
			CollectFilters(category);
		}

		// collect filters of specified category
		private void CollectFilters(Guid category)
		{
			object				comObj = null;
			ICreateDevEnum		enumDev = null;
			UCOMIEnumMoniker	enumMon = null;
			UCOMIMoniker[]		devMon = new UCOMIMoniker[1];
			int					hr;

			try
			{
				// Get the system device enumerator
				Type srvType = Type.GetTypeFromCLSID(Clsid.SystemDeviceEnum);
				if (srvType == null)
					throw new ApplicationException("Failed creating device enumerator");

				// create device enumerator
				comObj = Activator.CreateInstance(srvType);
				enumDev = (ICreateDevEnum) comObj;

				// Create an enumerator to find filters of specified category
				hr = enumDev.CreateClassEnumerator(ref category, out enumMon, 0);
				if (hr != 0)
					throw new ApplicationException("No devices of the category");

				// Collect all filters
				int n;
				while (true)
				{
					// Get next filter
					hr = enumMon.Next(1, devMon, out n);
					if ((hr != 0) || (devMon[0] == null))
						break;

					// Add the filter
					Filter filter = new Filter(devMon[0]);
					InnerList.Add(filter);

					// Release COM object
					Marshal.ReleaseComObject(devMon[0]);
					devMon[0] = null;
				}

				// Sort the collection
				InnerList.Sort();
			}

			finally
			{
				// release all COM objects
				enumDev = null;
				if (comObj != null)
				{
					Marshal.ReleaseComObject(comObj);
					comObj = null;
				}
				if (enumMon != null)
				{
					Marshal.ReleaseComObject(enumMon);
					enumMon = null;
				}
				if (devMon[0] != null)
				{
					Marshal.ReleaseComObject(devMon[0]);
					devMon[0] = null;
				}
			}
		}

		// Get a filter at the specified index
		internal Filter this[int index]
		{
			get
			{
				return ((Filter) InnerList[index]);
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Pakistan Pakistan
BCSE - Software Engineering (2000 - 2004)
Foundation University Institute of Management and Computer Sciences.
Pakistan.

MS - Computer Sciences (2004 - 2005)
Lahore Univeristy of Management Sciences
Pakistan.

Comments and Discussions