120分查找"C#低级Windows API钩子拦截键盘输入"的源代码
其余分数开帖再给
文章地址:http://hi.baidu.com/evenke/blog/item/42ea33a4de6b84f39052ee89.html
------解决方案--------------------
using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Text;  
using System.Windows.Forms;  
using System.Runtime.InteropServices;  
using System.Reflection;  
using System.Diagnostics;  
using System.IO;  
namespace WindowsApplication1  
{  
   ///     <summary>   
   /// Description of MainForm.   
   ///     </summary>   
   public partial class Form4 : Form  
   {  
       //委托  
   public delegate int HookProc(int nCode, int wParam, IntPtr lParam);  
       static int hHook = 0;  
       public const int WH_KEYBOARD_LL = 13;  
       //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。   
       HookProc KeyBoardHookProcedure;  
       //键盘Hook结构函数   
       [StructLayout(LayoutKind.Sequential)]  
       public class KeyBoardHookStruct  
       {  
           public int vkCode;  
           public int scanCode;  
           public int flags;  
           public int time;  
           public int dwExtraInfo;  
       }  
       #region DllImport  
       //设置钩子   
       [DllImport("user32.dll")]  
       public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);  
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  
       //抽掉钩子   
       public static extern bool UnhookWindowsHookEx(int idHook);  
       [DllImport("user32.dll")]  
       //调用下一个钩子   
       public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);  
       [DllImport("kernel32.dll")]  
       public static extern int GetCurrentThreadId();  
       [DllImport("kernel32.dll")]  
       public static extern IntPtr GetModuleHandle(string name);  
       #endregion  
       #region 自定义事件  
       public void Hook_Start()  
       {  
           // 安装键盘钩子   
           if (hHook == 0)  
           {  
               KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);  
               //hHook = SetWindowsHookEx(2,  
               //            KeyBoardHookProcedure,  
               //           GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());  
               hHook = SetWindowsHookEx(WH_KEYBOARD_LL,  
                         KeyBoardHookProcedure,  
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);  
               //如果设置钩子失败.   
               if (hHook == 0)  
               {  
                   Hook_Clear();  
                   //throw new Exception("设置Hook失败!");  
               }  
           }  
       }  
       //取消钩子事件   
       public void Hook_Clear()  
       {  
           bool retKeyboard = true;  
           if (hHook != 0)  
           {  
               retKeyboard = UnhookWindowsHookEx(hHook);  
               hHook = 0;  
           }  
           //如果去掉钩子失败.