日期:2014-05-18  浏览次数:20986 次

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; 

//如果去掉钩子失败.