C# 键盘钩子在C中全局禁用它#

C# 键盘钩子在C中全局禁用它#,c#,keyboard,keyboard-hook,C#,Keyboard,Keyboard Hook,有人知道如何在C#中禁用键盘全局开发挂钩吗 我有一个源代码,它实现了一个钩子来禁用同一应用程序中的键盘,但是如果我执行它并且键盘在文本编辑器中工作,那么在Windows7中就不能工作(我可以继续编写)。我希望全局捕获/禁用键盘(对于正在运行的所有应用程序)。我的目的是为Windows7完全锁定它 这是我的钩子代码: globalKeyboardHook gkh = new globalKeyboardHook(); /// <summary> /// Installs the gl

有人知道如何在C#中禁用键盘全局开发挂钩吗

我有一个源代码,它实现了一个钩子来禁用同一应用程序中的键盘,但是如果我执行它并且键盘在文本编辑器中工作,那么在Windows7中就不能工作(我可以继续编写)。我希望全局捕获/禁用键盘(对于正在运行的所有应用程序)。我的目的是为Windows7完全锁定它

这是我的钩子代码:

globalKeyboardHook gkh = new globalKeyboardHook();

/// <summary>
/// Installs the global hook
/// </summary>
public void hook() {
    IntPtr hInstance = LoadLibrary("User32");
    hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0);
}


public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) {
    //indicates if any of underlaing events set e.Handled flag
    bool handled = false;
    IntPtr lFakeParam = new IntPtr(lParam.vkCode);

    if ((code >= 0) && (KeyDown != null || KeyUp != null || wParam == WM_SYSKEYDOWN || wParam == WM_SYSKEYUP))
    {
        //read structure KeyboardHookStruct at lParam
        keyboardHookStruct MyKeyboardHookStruct = (keyboardHookStruct)Marshal.PtrToStructure(lFakeParam, typeof(keyboardHookStruct));
        Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;

        KeyEventArgs e = new KeyEventArgs(keyData);

        log.Debug("cached wParam = [" + wParam + "] vkCode = [" + MyKeyboardHookStruct.vkCode + "] flags = [" + MyKeyboardHookStruct.flags + "]");

        if (MyKeyboardHookStruct.vkCode == 144)
        {
            // NUMLOCK
            handled = false;
        }

        KeyDown(this, e);
    }
    //if event handled in application do not handoff to other listeners
    if (handled)
    {
        SendKeys.Send("{NUMLOCK}");
        SendKeys.Send("{NUMLOCK}");
        return 1;
        //return CallNextHookEx(hKeyboardHook, nCode, wParam, lFakeParam);
    }
    else
    {
        return CallNextHookEx(hhook, code, wParam, ref lParam);
    }
}
globalKeyboardHook gkh=新的globalKeyboardHook();
/// 
///安装全局钩子
/// 
公共空钩(){
IntPtr hInstance=LoadLibrary(“User32”);
hhook=SetWindowsHookEx(WH_-KEYBOARD,hookProc,hInstance,0);
}
public int hookProc(int代码、int wParam、ref keyboardHookStruct lParam){
//指示是否有任何基线事件设置为“已处理”标志
bool=false;
IntPtr lFakeParam=新的IntPtr(lParam.vkCode);
if((代码>=0)和&(KeyDown!=null | | | KeyUp!=null | | wParam==WM|SYSKEYDOWN | wParam==WM|SYSKEYUP))
{
//在LPRAM上读取结构KeyboardHookStruct
keyboardHookStruct MyKeyboardHookStruct=(keyboardHookStruct)Marshal.PtrToStructure(lFakeParam,typeof(keyboardHookStruct));
Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e=新的KeyEventArgs(keyData);
log.Debug(“缓存的wParam=[“+wParam+”]vkCode=[“+MyKeyboardHookStruct.vkCode+”]标志=[“+MyKeyboardHookStruct.flags+”]);
if(MyKeyboardHookStruct.vkCode==144)
{
//纽洛克
已处理=错误;
}
KeyDown(这个,e);
}
//若事件在应用程序中处理,请不要切换到其他侦听器
如果(已处理)
{
SendKeys.Send(“{NUMLOCK}”);
SendKeys.Send(“{NUMLOCK}”);
返回1;
//返回CallNextHookEx(hKeyboardHook、nCode、wParam、lFakeParam);
}
其他的
{
返回CallNextHookEx(hhook、code、wParam、ref lParam);
}
}

提前谢谢

您对hookproc委托的声明是错误的。返回值为IntPtr,而不是int。wParam参数的返回值相同。如果没有正确处理lParam参数,它已经是对结构的引用,并且使用lParam.vkCode会产生无意义的结果。谷歌示例代码来实现这一点。谢谢@HansPassant,但我尝试过,问题也是一样的,在HookProc函数定义接受(int(int,int,IntPtr target)。它在Windows XP中工作,但在Windows 7中我不知道为什么,但它有一些问题(有时会失败)。