我的代码使用RegisterWindowMessage函数。这是一个API函数生成一个唯一的消息ID,可以使用多个应用程序之间。当一个应用程序寄存器具有特定名称的消息,任何其他应用程序注册一个相同名称的消息,会得到相同的消息ID响应。 DLL使用消息由该函数生成的ID发布的所有消息。因此,托管代码也必须调用这个函数,知道消息的ID中的WndProc观看。里面的DLL
C DLL中包含的代码来处理8个不同类型的钩子。如果您愿意,您应能够遵循的模式,并轻松地创建额外的代码来处理其他的钩子类型。对于每种类型的钩子,有三个DLL中的函数。这三个功能更或多或少之间的所有不同的钩子类型相同。
InitializeAbcHook是从托管代码调用导出的函数。第一个参数是线程ID挂钩。设置为零,将钩的所有进程 - 给你一个全局钩子。您也可以使用这个只钩从一个线程,在许多情况下将远远超过挂接在所有线程的事件的有效的事件。第二个参数是挂钩事件将播出窗口的句柄。这应该是一个窗体或控件的句柄。 InitializeAbcHook的功能检查,看如果消息处理已存储(又名,另一个应用程序已经挂接使用我们的DLL),然后将其存储处理,使用这条线终于安装钩子:
hookAbc = SetWindowsHookEx(WH_ABC, (HOOKPROC)AbcHookCallback,
g_appInstance, threadID);
UninitializeAbcHook只是删除了钩。确保您的托管代码应用程序退出前调用 - 如果你不这样做,DLL将保持挂钩,即使您的应用程序(这是应该接受的挂钩)已经结束。这可能会导致一些重大问题,以及不必要的降低性能。AbcHookCallback
是实际的回调函数,并有点不同取决于钩型。对于最简单的钩子,像鼠标和键盘钩子,这个功能只是必要的信息发送到挂钩的应用程序的队列,然后继续调用CallNextHookEx挂钩链。对于像CBT或壳牌钩子,有可能发生的事件的多种类型 - 如激活或CREATEWND。确定哪种类型的子钩被称为回调函数,然后提出了相应的事件。对于CallWndProc和getmsg,有太多的数据发送到挂钩的应用程序只使用一个消息。对于这两个钩子,毕竟,有四件的数据,我们想知道在我们的托管应用程序:迷上窗口的句柄,就迷上了消息,和的lParam和wParam的值 - 但是,当发送自己的挂钩的应用程序的消息,我们只能在lParam和wParam参数发送数据。因此,这两个回调函数发送两个消息,一个手柄和截获消息,截获的lParam和wParam的。他们也有一个检查,以防止无限递归 - GetMsg消息发送到挂钩的应用程序,在发布的消息相同的回调函数,截获。托管代码:GlobalHooks.cs
我已经创建了一类称为GlobalHooks作为一个管理应用程序和DLL之间的中介功能,因此很容易在自己的项目实施的全局钩子。类包含一个抽象的内部类称为钩,以及8个钩的子类,每个钩支持的类型之一。
要使用自己的代码中的全局系统钩子,要做的第一件事是创建的GlobalHooks类的一个实例:
private GlobalHooks _GlobalHooks;
当你实例化这个类,你必须将它传递一个窗口句柄:
_GlobalHooks = new GlobalHooks(this.Handle);
,您还需要重写WndProc函数让GlobalHooks函数来处理所有传入的邮件。这ProcessWindowMessage功能检查从DLL的消息,表明一个钩子通知已提出。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29963-3.html
别以为这是US的强大