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

hyansuper 2012-03-10 09:53:27
我用c#写得钩子程序,调用user32.dll。但只有低级鼠标和低级键盘钩子能用,其他的全局钩子都不能用。

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

以上代码中把 "WH_KEYBOARD_LL" 改成 "WH_CALLWNDPROC" 就不成功。为什么呢?
...全文
48 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2012-03-11
  • 打赏
  • 举报
回复
[Quote=引用]
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。如果是本进程内的局部钩子,那可以考虑其他的方法,比如消息预处理等。钩子能不用,最好不用。
[/Quote]
原帖为:http://topic.csdn.net/u/20080529/11/19b6270d-e16f-441f-ac5f-639f72cab3e8.html
补充:
其他的钩子,比如WH_CALLWNDPROC,需要调用你的回调函数,这就需要函数所在的模块(一个dll)注入到目标进程。而纯C#是不能编写非托管dll的,因此不能安装成功。

zzzzv0 2012-03-10
  • 打赏
  • 举报
回复
直接去运行.exe

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧