使用C#作hook不需要作dll,在模块句柄里传 
API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), IntPtr hookId = SetWindowsHookEx(HookType.WH_KEYBOARD, this.myCallbackDelegate, API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 这样的代码是有效的 而当我想Hook一个远程进程,比如记事本或计算器的线程时 
IntPtr hookId = SetWindowsHookEx(HookType.WH_KEYBOARD, this.myCallbackDelegate, API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 3300); 后面的3300是远程进程的线程id,这是通过spy++获取到的 却出现了问题,SetWindowsHookEx的调用没用出问题,但那个远程进程比如记事本却出错了,报异常,myCallbackDelegate仅是返回1或CallNextHookEx,并没有作什么操作,问题出在哪了呢 注:但如果远程进程是一个.net编译出来的exe文件,不会报异常,但hook回调并没有被运行,至少没有看到应有的反应 再补充一个: 
===================================== 
在C#中安装跨进程的钩子时遇到错误,求助! 
相关主要语句如下: //相关委托方法如下:(在我自己写的库mydll中,类名是me.) 
public int MyHookProc(int code, int wparam, int lparam) 

Console.WriteLine("调用我了");//加上这条语句,实属无奈!!!!!!! inthw = FindWindow(null, "程序Ver 0.23"); 
if (!FindWindow(null, "程序Ver 0.23" ) 
Console.WriteLine("找到了,窗口句柄是:{0}", inthw); 
else 
Console.WriteLine("没有找到"); 
tpid = 0; 
wtpi = GetWindowThreadProcessId(inthw, out tpid); 
return CallNextHookEx(HHook, code, wparam, lparam); 
} public delegate int HookProc(int code, int wparam, int lparam); public HookProc myhookProc = new HookProc(new me().MyHookProc); //声明一个自己的Hook实现函数的委托对象 ip = LoadLibrary("mydll.DLL");//mydll是我自己建的一个类库。 HHook = SetWindowsHookEx(HookType.WH_CALLWNDPROC, myhookProc, ip, wtpi);//到这都是正确的,错误就发生在这条语句执行后,会引起我安装钩子的程序死掉,系统提示是:发生了一个严重错误。 我已经找了一下午了没有结果。希望大家能给我指一条明路。 
====== 
以上是另一位仁兄的贴子,也没有找到原因,他碰到的问题实际上跟我是一样的,只是它是用了DLL,而我没用DLL,而是用 
API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)