Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#钩住键盘没有的地方';行不通_C#_Delegates_Hook - Fatal编程技术网

c#钩住键盘没有的地方';行不通

c#钩住键盘没有的地方';行不通,c#,delegates,hook,C#,Delegates,Hook,我试图理解.NET中的windows钩子。我要听按键(全局)。我理解SetWindowsHooks的第一个和第二个参数的含义。第一个参数指定钩子的类型,例如WHU键盘的2,第二个参数指定回调处理程序的类型,例如,如果事件发生,应该调用哪个函数 hookID = SetWindowsHookEx((int) WH_TYPE.WH_KEYBOARD, hp,IntPtr.Zero, 0); 如果我将最后一个参数设置为0,我可以截获系统中所有线程的事件 hookID = SetWindowsHook

我试图理解.NET中的windows钩子。我要听按键(全局)。我理解SetWindowsHooks的第一个和第二个参数的含义。第一个参数指定钩子的类型,例如WHU键盘的2,第二个参数指定回调处理程序的类型,例如,如果事件发生,应该调用哪个函数

hookID = SetWindowsHookEx((int) WH_TYPE.WH_KEYBOARD, hp,IntPtr.Zero, 0);
如果我将最后一个参数设置为0,我可以截获系统中所有线程的事件

hookID = SetWindowsHookEx((int) WH_TYPE.WH_KEYBOARD, hp,IntPtr.Zero, 0);
但是为什么(以及如何)我必须指定第三个参数?我尝试以以下形式在控制台应用程序中挂接WH_键盘(类型2):

hookID = SetWindowsHookEx((int) WH_TYPE.WH_KEYBOARD, hp,IntPtr.Zero, 0);
它不起作用。因为IntPtr.Zero在此上下文中无效。有人能解释一下第三个参数的含义吗?我如何指定一个有效的参数,以便我的控制台应用程序能够对(全局)WHU键盘事件做出反应

hookID = SetWindowsHookEx((int) WH_TYPE.WH_KEYBOARD, hp,IntPtr.Zero, 0);

提前感谢

这不是可以在C代码中使用的钩子类型,它需要DLL注入。改用键盘。需要一个控制台模式应用程序没有的消息循环,很多库都提供了一个。只需在Nuget中搜索“键盘钩子”。那么我什么时候应该使用WH_键盘呢?如果我想在@HansPassant上使用它,那么为什么以及如何指定hInstance(第三个参数),谢谢你的回答。如果我在控制台应用程序中调用“Application.Run()”,则会调用钩子过程。为什么Application.Run()会创建消息循环?为什么这样的循环不能从“纯”控制台应用程序调用?
hookID = SetWindowsHookEx((int) WH_TYPE.WH_KEYBOARD, hp,IntPtr.Zero, 0);