被修改........
抱歉先生,我指的是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);
}
}
有人可以向我解释一下...... ??
答案 0 :(得分:2)
简而言之,此代码初始化一个键记录器。传入的参数proc,是一个回调函数,将在每次按键时调用。
using语句只是确保在声明的变量(curProcess和curModule)离开作用域时立即调用dispose(),从而以适当的方式正确释放资源,而不是等待垃圾收集器释放它们,这可能需要而
SetWindowsHookEx是一个win32 api调用,允许您注册在特定操作系统级别事件发生时调用的回调。在这种情况下,第一个参数WH_KEYBOARD_LL指定您要注册低级键盘事件。第二个参数是将被调用的回调(.Net中的Delegate)。第三个参数是一个窗口句柄(由OS管理的指针)到回调所在的模块,在这种情况下是进程的主.exe。请注意,进程在任何给定时间都加载了多个模块(exe或dll)。最后一个参数是您要监视的线程ID;因为传入0,所以将为操作系统上打开的任何窗口的任何键事件调用回调。
答案 1 :(得分:0)
GetModuleHandle()
是一个Windows API,用简单的单词返回加载的DLL或EXE的句柄。
您可以在this link
查看此API的详细说明直接来自MSDN:
GetModuleHandle函数返回映射模块的句柄,而不增加其引用计数。因此,在将句柄传递给FreeLibrary函数时要小心,因为这样做会导致DLL模块过早地被取消映射。
必须在多线程应用程序中小心使用此函数。无法保证模块句柄在此函数返回句柄和使用它的时间之间保持有效。例如,线程检索模块句柄,但在使用句柄之前,第二个线程释放模块。如果系统加载另一个模块,它可以重用最近释放的模块句柄。因此,第一个线程将拥有一个不同于预期模块的句柄。
答案 2 :(得分:0)
首先,作为Windows库函数问题的一般要点,您应该考虑搜索MSDN。 Here是GetModuleHandle()的MSDN页面,它包含许多相关信息。
对于你的问题(以及任何更熟悉Windows API的人都可以随意纠正我),“模块”是Windows中程序的一种全能术语,通常特指可执行文件(.exe) )或图书馆(.dll)。 “句柄”是指指针的术语。 GetModuleHandle()返回指向特定程序(模块)的指针(句柄)。正如帕维尔评论的那样,两者都是非常广泛的术语。
至于您发布的代码段:
它正在获取当前正在运行的进程以及当前模块(显而易见)。 然后调用SetWindowsHookEx(参考MSDN获取更多信息),它接受事件挂钩(在这种情况下,低级键盘事件。),一个在挂钩事件发生时调用(proc)的过程,以及一个指向目前的计划。
有关挂钩的详细信息,请参阅MSDN上的Hooks。
基本上这篇文章的消息是更多地使用MSDN,它是一个非常可靠的文档:)