当前位置:编程学习 > C#/ASP.NET >>

Help: C#写的钩子程序只有低级鼠标和低级键盘钩子能用?

我用c#写得钩子程序,调用user32.dll。但只有低级鼠标和低级键盘钩子能用,其他的全局钩子都不能用。

HookId = User32API.SetWindowsHookEx(WH_KEYBOARD_LL,
                        HookProc,
                        Marshal.GetHINSTANCE(Assembly.GetCallingAssembly().GetModules()[0]),
                        0);

以上代码中把 "WH_KEYBOARD_LL" 改成 "WH_CALLWNDPROC" 就不成功。为什么呢? --------------------编程问答-------------------- 直接去运行.exe --------------------编程问答--------------------
引用
WH_KEYBOARD的确不能安装全局钩子,C#也的确不能写非托管DLL(native Dll)。

但WH_KEYBOARD_LL和WH_MOUSE_LL是例外:安装Low Level鼠标或键盘钩子并没有把Dll模块注入到其他线程中,而是在钩子回调时,上下文切换(Context switch,每个线程都有其独特的上下文)到安装线程。这就是为什么C#不能写非托管DLL,却能安装Low Level键盘钩子的原因。

楼主用了WH_KEYBOARD。如果设计意图是个全局钩子,那就要检讨是否改成WH_KEYBOARD_LL。如果是本进程内的局部钩子,那可以考虑其他的方法,比如消息预处理等。钩子能不用,最好不用。

原帖为:http://topic.csdn.net/u/20080529/11/19b6270d-e16f-441f-ac5f-639f72cab3e8.html
补充:
其他的钩子,比如WH_CALLWNDPROC,需要调用你的回调函数,这就需要函数所在的模块(一个dll)注入到目标进程。而纯C#是不能编写非托管dll的,因此不能安装成功。

补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,