Click here to Skip to main content
15,891,431 members
Articles / Programming Languages / C#

Command Prompt Explorer Bar

Rate me:
Please Sign up or sign in to vote.
4.93/5 (184 votes)
10 Jun 20023 min read 1.4M   23.9K   356  
This tool extends explorer with functionality of a command prompt. Implemented as a band object completely in C#. Demonstrates COM Interop and P/Invoke, windows hooking and API interception. Finally you can run all these .Net SDK tools and ‘Hello World!’ programs without leaving explorer shell.
// Pavel Zolnikov[http://www.codeproject.com/script/profile/whos_who.asp?id=35980], 2002

using System;
using System.Runtime.InteropServices;

namespace ZCommon
{
	/// <summary>
	/// Implements base functionality required for setting Windows Hooks (SetWindowsHookEx API)
	/// </summary>
	/// <example>
	/// 
	/// //Sample hook that raises Idle event when thread is about to go idle.
	/// //Can be usefull for procesing background lo priority tasks
	/// 	public class IdleHook : WindowsHook
	/// 	{
	/// 		public void Start()
	/// 		{
	/// 			UnHookMe();
	/// 			HookMe(11);//WH_FOREGROUNDIDLE
	/// 		}
	///   
	/// 		public void Stop()
	/// 		{
	/// 			UnHookMe();
	/// 		}
	/// 
	/// 		public event EventHandler Idle;
	/// 
	/// 		protected override Int32 HookCallBack(Int32 ncode, Int32 wParam, Int32 lParam)
	/// 		{
	/// 			if( Idle != null )
	/// 				Idle(this, EventArgs.Empty);
	/// 
	/// 			return base.HookCallBack(ncode, wParam, lParam);
	/// 		}
	/// 	}
	/// </example>
	abstract public class WindowsHook : MarshalByRefObject, IDisposable 
	{
		WindowsHook.WindowsHookCallBack hookDelegate;
		IntPtr hhook;

		/// <summary>
		///	Override this function to process hooks
		/// </summary>
		/// <remarks>
		/// Call <code>return base.HookCallBack(ncode, wParam, lParam)</code> at the end.
		/// </remarks>
		protected virtual Int32 HookCallBack(Int32 ncode, Int32 wParam, Int32 lParam)
		{
			GC.KeepAlive(this);//FxCop
			/// making sure that other hooks get chance to process event as well.
			return CallNextHookEx(hhook , ncode, wParam, lParam);
		}

		/// <summary>
		/// Hooks <code>HookCallBack</code> method to process event of type specified by <code>idHook</code>;
		/// </summary>
		/// <param name="idHook">See winuser.h for possible values(WH_something)</param>
		protected void HookMe(Int32 idHook)
		{
			GC.KeepAlive(this);
			hookDelegate = new WindowsHookCallBack(hookCallBack);

			hhook = SetWindowsHookEx( 
				idHook,
				hookDelegate,
				IntPtr.Zero,
				Win32.GetCurrentThreadId() );	
		}

		/// <summary>
		/// Stops processing events.
		/// </summary>
		protected void UnHookMe()
		{
			GC.KeepAlive(this);
			if( hhook != IntPtr.Zero )
			{
				UnhookWindowsHookEx( hhook );
				hhook = IntPtr.Zero;
			}

			if( hookDelegate != null )
				hookDelegate = null;				
		}

		/// <summary>
		/// Stops processing events, disposes of resources.
		/// </summary>
		public virtual void Dispose()
		{
			Dispose(true);
			GC.SuppressFinalize(this);
		}

		protected virtual void Dispose(bool disposing)
		{
			UnHookMe();
		}

		~WindowsHook()
		{
			Dispose(false);
		}

		/// <summary>
		/// WindowsHook callback prototype.
		/// </summary>
		delegate Int32 WindowsHookCallBack(Int32 ncode, Int32 wParam, Int32 lParam);

		/// <summary>
		/// Generic implementation of WindowsHook.
		/// </summary>
		/// <remarks>
		/// Checks ncode to be greater or equal to HC_ACTION before calling virtual HookCallBack.
		/// </remarks>
		Int32 hookCallBack(Int32 ncode, Int32 wParam, Int32 lParam)
		{
			GC.KeepAlive(this);
			return ncode >= 0 ?	//HC_ACTION, etc
				HookCallBack( ncode, wParam, lParam ) :
				CallNextHookEx(hhook , ncode, wParam, lParam);
		}

		[DllImport("user32.dll")]
		static extern IntPtr SetWindowsHookEx( Int32 idHook, WindowsHookCallBack lpfn, IntPtr hmodule, Int32 threadID);

		[DllImport("user32.dll")]
		static extern Int32 CallNextHookEx(IntPtr hhok, Int32 ncode, Int32 wParam, Int32 lParam);

		[DllImport("user32.dll")]
		static extern bool UnhookWindowsHookEx( IntPtr hhook );
	}
}

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 has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions