 
                    
                
         
    
    
        
    
    
    
    
        
            
                
    
        
            
            
            
                
 
 using System;
using System;
 using System.Windows.Forms;
using System.Windows.Forms;
 using System.Runtime.InteropServices;
using System.Runtime.InteropServices;
 using System.Reflection;
using System.Reflection;
 namespace HookDll
namespace HookDll


 {
{
 public class HookDll
 public class HookDll

 
  {
{
 private KBDLLHOOKSTRUCT kbdllhs;
  private KBDLLHOOKSTRUCT kbdllhs; 
 private IntPtr iHookHandle  =IntPtr.Zero;
  private IntPtr iHookHandle  =IntPtr.Zero;
 private GCHandle _hookProcHandle;
  private GCHandle _hookProcHandle;
 public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
 [DllImport("user32.dll", CharSet=CharSet.Auto)]
  [DllImport("user32.dll", CharSet=CharSet.Auto)]
 public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);
  public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid);
 
  
 [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
  [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
 public static extern bool UnhookWindowsHookEx(IntPtr hhook);
  public static extern bool UnhookWindowsHookEx(IntPtr hhook);
 
 
 [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
  [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
 public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);
  public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam);
 [DllImport("kernel32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
  [DllImport("kernel32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
 private static extern IntPtr GetModuleHandle(string lpModuleName);
  private static extern IntPtr GetModuleHandle(string lpModuleName);
 [DllImport("Kernel32.dll",EntryPoint="RtlMoveMemory")]
  [DllImport("Kernel32.dll",EntryPoint="RtlMoveMemory")] 
 public static extern void CopyMemory (ref KBDLLHOOKSTRUCT Source,IntPtr Destination,int Length);
  public static extern void CopyMemory (ref KBDLLHOOKSTRUCT Source,IntPtr Destination,int Length);

 private const int WH_KEYBOARD = 13;
  private const int WH_KEYBOARD = 13;
 
  
 public void DisableKBDHook()
  public void DisableKBDHook()

 
   {
{
 try
   try

 
    {
{
 if (iHookHandle!=IntPtr.Zero)
    if (iHookHandle!=IntPtr.Zero)

 
     {
{
 UnhookWindowsHookEx(iHookHandle);
     UnhookWindowsHookEx(iHookHandle);
 }
    }
 _hookProcHandle.Free();
    _hookProcHandle.Free();
 iHookHandle = IntPtr.Zero;
    iHookHandle = IntPtr.Zero;
 }
   }
 catch
   catch

 
    {
{
 return;
    return;
 }
   }
 }
  }
 public void EnableKBDHook()
  public void EnableKBDHook()

 
   {
{ 
 HookProc hookProc = new HookProc(KBDDelegate);
   HookProc hookProc = new HookProc(KBDDelegate);
 _hookProcHandle  = GCHandle.Alloc(hookProc);
   _hookProcHandle  = GCHandle.Alloc(hookProc);
 iHookHandle   = SetWindowsHookEx(WH_KEYBOARD, hookProc, GetModuleHandle("HookDll.dll"), 0);
   iHookHandle   = SetWindowsHookEx(WH_KEYBOARD, hookProc, GetModuleHandle("HookDll.dll"), 0);
 if (iHookHandle == IntPtr.Zero)
   if (iHookHandle == IntPtr.Zero) 

 
    {
{
 throw new System.Exception("错误,钩子失败!");
    throw new System.Exception("错误,钩子失败!");
 }
   }
 }
  }
 public IntPtr KBDDelegate(int iCode , IntPtr wParam,IntPtr lParam)
  public IntPtr KBDDelegate(int iCode , IntPtr wParam,IntPtr lParam)

 
   {
{
 kbdllhs    = new KBDLLHOOKSTRUCT();
   kbdllhs    = new KBDLLHOOKSTRUCT();
 CopyMemory(ref kbdllhs, lParam, 20);
   CopyMemory(ref kbdllhs, lParam, 20);
 
   
 //结果就在这里了^_^
   //结果就在这里了^_^
 int iHookCode = kbdllhs.vkCode;
   int iHookCode = kbdllhs.vkCode;
 DisableKBDHook();
   DisableKBDHook();
 EnableKBDHook();
   EnableKBDHook();
 return CallNextHookEx(iHookHandle, iCode, wParam,lParam);
   return CallNextHookEx(iHookHandle, iCode, wParam,lParam);
 }
  }
 }
 }
 [StructLayout(LayoutKind.Sequential)]
 [StructLayout(LayoutKind.Sequential)]
 public struct KBDLLHOOKSTRUCT
 public struct KBDLLHOOKSTRUCT

 
  {
{
 public int vkCode;
  public int vkCode;
 public int scanCode;
  public int scanCode;
 public int flags;
  public int flags;
 public int time;
  public int time;
 public int dwExtraInfo;
  public int dwExtraInfo;
 }
 }
 }
} 
             
            posted @ 
2008-05-22 22:12 
Max Woods 
阅读(
2406) 
评论() 
 
收藏 
举报