c#全局键盘hook

来源:百度知道 编辑:UC知道 时间:2024/07/07 00:49:15
为什么成功执行了,但HOOK局柄返回0,我只想实现按下键盘A时触发事件
namespace hook
{
public partial class Form1 : Form
{
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hKeyboardHook = 0;
public const int WH_KEYBOARD_LL = 13;
public event KeyEventHandler OnKeyDownEvent;
public event KeyEventHandler OnKeyUpEvent;
public event KeyPressEventHandler OnKeyPressEvent;
HookProc hookp;
public Form1()
{
InitializeComponent();
}

private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if ((nCode >= 0) && (OnKeyDownEvent != null |

以下不是官方答案。因为我看了官方答案觉得都是套话。如果不清楚api的话,看了也不懂的。现在给你总结一下哈

1.其中nCode代表钩子类型0为全局钩子1为线程钩子--这个是我的猜测哈,因为我做的时候它的值确实反映了这一点,
2.wParam代表是按下还是放开 在C#中,按下时它的值为256 放开时其值为257,所以每拦截一个键触发两次子程,所以可以根据它的值判断是按下还是放开,但是标准式的答案我就说不出来咯。
3.lParam 这个可以理解为按键的句柄吧,它在C#中可以用一下的一个类(或者结构体)来分解:
public struct KeyMSG
{
public int vkCode;//键符虚拟码
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}

如果你要拦截A,那就在你的子程里面这样写
KeyMSG keys = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));
keyCode = keys.vkCode;
这样,在你按下A时调试,就可以得到keyCode的值,然后就可以加if了哈,注意这里的keyCode是不分大小写的,所以你按了a或者A值都是一样的哈,还有就是判断是按下还是放开的问题,就如前面所说,每按一个键都要出发两次钩子子程的(以我的经验),所以这里也要做适当判断了哦。

在.net 2005平台下 在使用全局hook时,回遇见SetWindowsHookEx的返回值为0,这是因为.net 调试模式的问题
具体的做法是

禁用宿主进程

在 Visual Studio 中打开项目。

在“项目”菜单上单击“属性”。

单击“调试”选项卡。

清除“启用 Visual Studio 宿主进程”复选框。

文章出处:c#没有全局函数?? C#如何设计全局热键? C#怎样实现全局功能!谢谢 c#中定义全局数组的问题 如何实现全局键盘钩子c++的代码 Shell Hook 什么是HOOK? Vb 全局热建的问题(如何做到判断键盘松开按下) 怎么用C#编程,让键盘不起作用? 如何实现C# 的键盘事件