Server/WindowsHook.cs
author sl
Fri, 15 Aug 2014 10:20:01 +0200
changeset 30 c375286d1a1c
parent 0 f6eca6facd07
permissions -rw-r--r--
Still trying to setup WCF for us to work nicely.
Now using multi threading and reliable session.
Implementing thread safe functions where needed.
Enforcing session mode.
Fixing bug in marquee label as we forgot to reset current position when text is changed.
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
}