GetModuleHandle()在这段代码中做了什么?

时间:2009-07-14 05:33:54

标签: c# winapi

被修改........

抱歉先生,我指的是Stephen Toub的文章中的这段代码..


    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

有人可以向我解释一下...... ??

3 个答案:

答案 0 :(得分:2)

简而言之,此代码初始化一个键记录器。传入的参数proc,是一个回调函数,将在每次按键时调用。

using语句只是确保在声明的变量(curProcess和curModule)离开作用域时立即调用dispose(),从而以适当的方式正确释放资源,而不是等待垃圾收集器释放它们,这可能需要而

SetWindowsHookEx是一个win32 api调用,允许您注册在特定操作系统级别事件发生时调用的回调。在这种情况下,第一个参数WH_KEYBOARD_LL指定您要注册低级键盘事件。第二个参数是将被调用的回调(.Net中的Delegate)。第三个参数是一个窗口句柄(由OS管理的指针)到回调所在的模块,在这种情况下是进程的主.exe。请注意,进程在任何给定时间都加载了多个模块(exe或dll)。最后一个参数是您要监视的线程ID;因为传入0,所以将为操作系统上打开的任何窗口的任何键事件调用回调。

更多信息here about SetWindowsHookEx

答案 1 :(得分:0)

GetModuleHandle()是一个Windows API,用简单的单词返回加载的DLL或EXE的句柄。

您可以在this link

查看此API的详细说明

直接来自MSDN:

GetModuleHandle函数返回映射模块的句柄,而不增加其引用计数。因此,在将句柄传递给FreeLibrary函数时要小心,因为这样做会导致DLL模块过早地被取消映射。

必须在多线程应用程序中小心使用此函数。无法保证模块句柄在此函数返回句柄和使用它的时间之间保持有效。例如,线程检索模块句柄,但在使用句柄之前,第二个线程释放模块。如果系统加载另一个模块,它可以重用最近释放的模块句柄。因此,第一个线程将拥有一个不同于预期模块的句柄。

答案 2 :(得分:0)

首先,作为Windows库函数问题的一般要点,您应该考虑搜索MSDNHere是GetModuleHandle()的MSDN页面,它包含许多相关信息。

对于你的问题(以及任何更熟悉Windows API的人都可以随意纠正我),“模块”是Windows中程序的一种全能术语,通常特指可执行文件(.exe) )或图书馆(.dll)。 “句柄”是指指针的术语。 GetModuleHandle()返回指向特定程序(模块)的指针(句柄)。正如帕维尔评论的那样,两者都是非常广泛的术语。

至于您发布的代码段:

它正在获取当前正在运行的进程以及当前模块(显而易见)。 然后调用SetWindowsHookEx(参考MSDN获取更多信息),它接受事件挂钩(在这种情况下,低级键盘事件。),一个在挂钩事件发生时调用(proc)的过程,以及一个指向目前的计划。

有关挂钩的详细信息,请参阅MSDN上的Hooks

基本上这篇文章的消息是更多地使用MSDN,它是一个非常可靠的文档:)

相关问题