首页
社区
课程
招聘
[原创]全局HOOK API (C#) 的实现及源码提供
发表于: 2008-11-26 09:47 8092

[原创]全局HOOK API (C#) 的实现及源码提供

2008-11-26 09:47
8092
最近一个朋友在做个监控程序,需要监控键盘和鼠标的活动,但是用C#的程序(其他语言的HOOK都很平常了),他也查了KB,问我怎么实现。我也查了一下如这个KB就是:
KB318804 “HOW TO: Set a Windows Hook in Visual C# .NET”
基本意思是.NET的DLL没法被unmanaged code的进程调用,所以.NET无法写全局钩子。

但觉得还是不可思议啊,.NET不能底层了?但在还是在KB中得到了答案,WH_KEYBOARD_LL和WH_MOUSE_LL是可以在.NET里面用的全局钩子。

主要实现代码
[DllImport("user32.dll", CharSet = CharSet.Auto,
           CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int SetWindowsHookEx(
            int idHook,
            HookProc lpfn,
            IntPtr hMod,
            int dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto,
            CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int UnhookWindowsHookEx(int idHook);


[DllImport("user32.dll", CharSet = CharSet.Auto,
             CallingConvention = CallingConvention.StdCall)]
        private static extern int CallNextHookEx(
            int idHook,
            int nCode,
            int wParam,
            IntPtr lParam);

[DllImport("user32")]
        private static extern int ToAscii(
            int uVirtKey,
            int uScanCode,
            byte[] lpbKeyState,
            byte[] lpwTransKey,
            int fuState);

[DllImport("user32")]
        private static extern int GetKeyboardState(byte[] pbKeyState);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern short GetKeyState(int vKey);
使用SetWindowsHookEx函数(API函数),指定一个Hook类型、自己的Hook过程是全局还是局部Hook,同时给出Hook过程的进入点,就可以轻松的安装自己的Hook。
                  // 创建鼠标实例.
                MouseHookProcedure = new HookProc(MouseHookProc);
                //安装 鼠标hook
                hMouseHook = SetWindowsHookEx(
                    WH_MOUSE_LL,
                    MouseHookProcedure,
                    Marshal.GetHINSTANCE(
                        Assembly.GetExecutingAssembly().GetModules()[0]),
                    0);

                // 创建键盘实例.
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                //安装 键盘hook
                hKeyboardHook = SetWindowsHookEx(
                    WH_KEYBOARD_LL,
                    KeyboardHookProcedure,
                    Marshal.GetHINSTANCE(
                    Assembly.GetExecutingAssembly().GetModules()[0]),
                    0);
卸载Hook UnhookWindowsHookEx()函数(API函数)

具体可以查看源码

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 133
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
多谢楼主分享代码
2008-11-27 18:26
0
雪    币: 1022
活跃值: (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
用鼠标点击软键盘怎么扑捉
2008-11-27 20:31
0
雪    币: 234
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
一个是正常的软键盘当然会被捕捉到。对于加密的你要自己处理,看来你的用途不一般啊。
2008-11-27 21:39
0
游客
登录 | 注册 方可回帖
返回
//