八. 把击键传递到下一个应用程序 一个良好的键盘钩子回调方法应该以调用CallNextHookEx函数并且返回它的结果结束。这可以确保其它应用程序能够有机会处理针对于它们的击键。
然而,KeyboardHook类的主要功能在于,阻止击键被传播到任何其它更多的应用程序。因此它无论在何时处理一次击键,HookCallback都将返回一个哑值:
另一方面,它确实调用CallNextHookEx-如果它不处理该事件,或如果重载的构造器中的使用KeyboardHook传递的参数允许某些组合键通过。
CallNextHookEx被启用-通过从user32.dll导入该函数,如下列代码所示:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref KeyInfoStruct lParam); |
然后,被导入的方法被HookCallMethod所调用,这可以确保所有的通过钩子接收到的参数被继续传递到下一个应用程序中:
| CallNextHookEx(hookID, nCode, wParam, ref lParam); |
如前面所提及,如果在lParam中的flags是不相关的,那么可以修改导入的CallNextHookEx的签名以把lParam定义为System.IntPtr。
九. 移去钩子 处理钩子的最后一步是使用从user32.dll中导入的UnhookWindowsHookEx函数移去它(当破坏KeyboardHook类的实例时),如下所示:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); |
既然KeyboardHook实现IDisposable,那么这可以在Dispose方法中完成。
public void Dispose() { UnhookWindowsHookEx(hookID); } |
hookID是构造器在调用SetWindowsHookEx所返回的id。这将从钩子链中删除应用程序。
上一页 [1] [2] [3] [4]