代码人生的小狗窝

一行行枯燥的代码,却描绘出人生的点点滴滴

您现在的位置是:首页>_C#

120分查找"C#低级Windows API钩子拦截键盘输入"的源代码,该如何解决

发布时间:2019-09-20浏览(615)

    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; 

    //如果去掉钩子失败.
    if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");