Server/WindowsHook.cs
author sl
Sun, 11 Jan 2015 19:00:16 +0100
changeset 86 829dd13b1048
parent 0 f6eca6facd07
permissions -rw-r--r--
Adding app exit event handler.
sl@0
     1
//=============================================================================
sl@0
     2
// COPYRIGHT: Prosoft-Lanz
sl@0
     3
//=============================================================================
sl@0
     4
//
sl@0
     5
// $Workfile: WindowsHook.cs $
sl@0
     6
//
sl@0
     7
// PROJECT : CodeProject Components
sl@0
     8
// VERSION : 1.00
sl@0
     9
// CREATION : 19.02.2003
sl@0
    10
// AUTHOR : JCL
sl@0
    11
//
sl@0
    12
// DETAILS : This class implement the Windows hook mechanism.
sl@0
    13
//           From MSDN, Dino Esposito.
sl@0
    14
//
sl@0
    15
//-----------------------------------------------------------------------------
sl@0
    16
using System;
sl@0
    17
using System.Runtime.InteropServices;
sl@0
    18
sl@0
    19
namespace CodeProject.Win32API.Hook
sl@0
    20
{
sl@0
    21
	///////////////////////////////////////////////////////////////////////
sl@0
    22
	#region Class HookEventArgs
sl@0
    23
sl@0
    24
	/// Class used for hook event arguments.
sl@0
    25
	public class HookEventArgs : EventArgs
sl@0
    26
	{
sl@0
    27
		/// Event code parameter.
sl@0
    28
		public int code;
sl@0
    29
		/// wParam parameter.
sl@0
    30
		public IntPtr wParam;
sl@0
    31
		/// lParam parameter.
sl@0
    32
		public IntPtr lParam;
sl@0
    33
sl@0
    34
		internal HookEventArgs(int code, IntPtr wParam, IntPtr lParam)
sl@0
    35
		{
sl@0
    36
			this.code = code;
sl@0
    37
			this.wParam = wParam;
sl@0
    38
			this.lParam = lParam;
sl@0
    39
		}
sl@0
    40
	}
sl@0
    41
	
sl@0
    42
	#endregion
sl@0
    43
sl@0
    44
	///////////////////////////////////////////////////////////////////////
sl@0
    45
	#region Enum HookType
sl@0
    46
sl@0
    47
	/// Hook Types.
sl@0
    48
	public enum HookType : int
sl@0
    49
	{
sl@0
    50
		/// <value>0</value>
sl@0
    51
		WH_JOURNALRECORD = 0,
sl@0
    52
		/// <value>1</value>
sl@0
    53
		WH_JOURNALPLAYBACK = 1,
sl@0
    54
		/// <value>2</value>
sl@0
    55
		WH_KEYBOARD = 2,
sl@0
    56
		/// <value>3</value>
sl@0
    57
		WH_GETMESSAGE = 3,
sl@0
    58
		/// <value>4</value>
sl@0
    59
		WH_CALLWNDPROC = 4,
sl@0
    60
		/// <value>5</value>
sl@0
    61
		WH_CBT = 5,
sl@0
    62
		/// <value>6</value>
sl@0
    63
		WH_SYSMSGFILTER = 6,
sl@0
    64
		/// <value>7</value>
sl@0
    65
		WH_MOUSE = 7,
sl@0
    66
		/// <value>8</value>
sl@0
    67
		WH_HARDWARE = 8,
sl@0
    68
		/// <value>9</value>
sl@0
    69
		WH_DEBUG = 9,
sl@0
    70
		/// <value>10</value>
sl@0
    71
		WH_SHELL = 10,
sl@0
    72
		/// <value>11</value>
sl@0
    73
		WH_FOREGROUNDIDLE = 11,
sl@0
    74
		/// <value>12</value>
sl@0
    75
		WH_CALLWNDPROCRET = 12,		
sl@0
    76
		/// <value>13</value>
sl@0
    77
		WH_KEYBOARD_LL = 13,
sl@0
    78
		/// <value>14</value>
sl@0
    79
		WH_MOUSE_LL = 14
sl@0
    80
	}
sl@0
    81
	#endregion
sl@0
    82
sl@0
    83
	///////////////////////////////////////////////////////////////////////
sl@0
    84
	#region Class WindowsHook
sl@0
    85
sl@0
    86
	/// <summary>
sl@0
    87
	/// Class to expose the windows hook mechanism.
sl@0
    88
	/// </summary>
sl@0
    89
	public class WindowsHook
sl@0
    90
	{
sl@0
    91
		/// <summary>
sl@0
    92
		/// Hook delegate method.
sl@0
    93
		/// </summary>
sl@0
    94
		public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
sl@0
    95
sl@0
    96
		// internal properties
sl@0
    97
		internal IntPtr hHook = IntPtr.Zero;
sl@0
    98
		internal HookProc filterFunc = null;
sl@0
    99
		internal HookType hookType;
sl@0
   100
sl@0
   101
		/// <summary>
sl@0
   102
		/// Hook delegate method.
sl@0
   103
		/// </summary>
sl@0
   104
		public delegate void HookEventHandler(object sender, HookEventArgs e);
sl@0
   105
sl@0
   106
		/// <summary>
sl@0
   107
		/// Hook invoke event.
sl@0
   108
		/// </summary>
sl@0
   109
		public event HookEventHandler HookInvoke;
sl@0
   110
sl@0
   111
		internal void OnHookInvoke(HookEventArgs e)
sl@0
   112
		{
sl@0
   113
			if (HookInvoke != null)
sl@0
   114
				HookInvoke(this, e);
sl@0
   115
		}
sl@0
   116
sl@0
   117
		/// <summary>
sl@0
   118
		/// Construct a HookType hook.
sl@0
   119
		/// </summary>
sl@0
   120
		/// <param name="hook">Hook type.</param>
sl@0
   121
		public WindowsHook(HookType hook)
sl@0
   122
		{
sl@0
   123
			hookType = hook;
sl@0
   124
			filterFunc = new HookProc(this.CoreHookProc);
sl@0
   125
		}
sl@0
   126
		/// <summary>
sl@0
   127
		/// Construct a HookType hook giving a hook filter delegate method.
sl@0
   128
		/// </summary>
sl@0
   129
		/// <param name="hook">Hook type</param>
sl@0
   130
		/// <param name="func">Hook filter event.</param>
sl@0
   131
		public WindowsHook(HookType hook, HookProc func)
sl@0
   132
		{
sl@0
   133
			hookType = hook;
sl@0
   134
			filterFunc = func; 
sl@0
   135
		}
sl@0
   136
sl@0
   137
		// default hook filter function
sl@0
   138
		internal int CoreHookProc(int code, IntPtr wParam, IntPtr lParam)
sl@0
   139
		{
sl@0
   140
			if (code < 0)
sl@0
   141
				return CallNextHookEx(hHook, code, wParam, lParam);
sl@0
   142
sl@0
   143
			// let clients determine what to do
sl@0
   144
			HookEventArgs e = new HookEventArgs(code, wParam, lParam);
sl@0
   145
			OnHookInvoke(e);
sl@0
   146
sl@0
   147
			// yield to the next hook in the chain
sl@0
   148
			return CallNextHookEx(hHook, code, wParam, lParam);
sl@0
   149
		}
sl@0
   150
sl@0
   151
		/// <summary>
sl@0
   152
		/// Install the hook. 
sl@0
   153
		/// </summary>
sl@0
   154
		public void Install()
sl@0
   155
		{
sl@0
   156
			hHook = SetWindowsHookEx(hookType, filterFunc, IntPtr.Zero, (int)AppDomain.GetCurrentThreadId());
sl@0
   157
		}
sl@0
   158
sl@0
   159
		
sl@0
   160
		/// <summary>
sl@0
   161
		/// Uninstall the hook.
sl@0
   162
		/// </summary>
sl@0
   163
 		public void Uninstall()
sl@0
   164
		{
sl@0
   165
			if (hHook != IntPtr.Zero)
sl@0
   166
			{
sl@0
   167
				UnhookWindowsHookEx(hHook);
sl@0
   168
				hHook = IntPtr.Zero;
sl@0
   169
			}
sl@0
   170
		}
sl@0
   171
sl@0
   172
		#region Win32 Imports
sl@0
   173
sl@0
   174
		[DllImport("user32.dll")]
sl@0
   175
		internal static extern IntPtr SetWindowsHookEx(HookType code, HookProc func, IntPtr hInstance, int threadID);
sl@0
   176
sl@0
   177
		[DllImport("user32.dll")]
sl@0
   178
		internal static extern int UnhookWindowsHookEx(IntPtr hhook); 
sl@0
   179
sl@0
   180
		[DllImport("user32.dll")]
sl@0
   181
		internal static extern int CallNextHookEx(IntPtr hhook, int code, IntPtr wParam, IntPtr lParam);
sl@0
   182
sl@0
   183
		#endregion
sl@0
   184
	}
sl@0
   185
	#endregion
sl@0
   186
}