public class Win32Hook { [DllImport("kernel32")] public static extern int GetCurrentThreadId(); [DllImport( "user32", CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)] public static extern int SetWindowsHookEx( HookType idHook, HOOKPROC lpfn, int hmod, int dwThreadId); public enum HookType { WH_GETMESSAGE = 3 } public delegate int HOOKPROC(int nCode, int wParam, int lParam); public void SetHook() { SetWindowsHookEx(HookType.WH_GETMESSAGE, new HOOKPROC(this.MyKeyboardProc), 0, GetCurrentThreadId()); } public int MyKeyboardProc(int nCode, int wParam, int lParam) { return 0; } }
如果用c#写的托管dll估计是不太可能inject到非托管代码的process里面的。
HOOK函数可以直接调windows API。
估计那个hook dll不太可能用托管代码实现。
如果哪位能实现,偶也认真学习。
.NET 做的GUI程序运行也巨慢,钩也白钩,越钩越慢....
{ [DllImport("kernel32")]
public static extern int GetCurrentThreadId(); [DllImport( "user32",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(
HookType idHook,
HOOKPROC lpfn,
int hmod,
int dwThreadId); public enum HookType
{
WH_GETMESSAGE = 3
} public delegate int HOOKPROC(int nCode, int wParam, int lParam); public void SetHook()
{
SetWindowsHookEx(HookType.WH_GETMESSAGE,
new HOOKPROC(this.MyKeyboardProc),
0,
GetCurrentThreadId());
} public int MyKeyboardProc(int nCode, int wParam, int lParam)
{
return 0;
}
}
最后,感谢大家的参与。