C# 键盘挂钩没有抓住每个键

C# 键盘挂钩没有抓住每个键,c#,keyboard,hook,key,keyboard-hook,C#,Keyboard,Hook,Key,Keyboard Hook,我的全局键盘挂钩有问题 在大多数情况下,它是有效的。Bu,t在下面的部分中,它应该阻止enter键被传递到聚焦程序上。它只有大约一半的时间有效 关于为什么有时会阻止enter键而不是其他键,您有什么想法吗 以下是相关代码: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook,

我的全局键盘挂钩有问题

在大多数情况下,它是有效的。Bu,t在下面的部分中,它应该阻止enter键被传递到聚焦程序上。它只有大约一半的时间有效

关于为什么有时会阻止enter键而不是其他键,您有什么想法吗

以下是相关代码:

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
        LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
        IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);


    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;
以及:

以及:


可能重复我检查过的一个,不是同一个问题,键盘事件是用钩子触发的,但例如,回车键应该在我的代码中被阻止,但它只在某些时候捕捉到它。谢谢你。
_hookID = SetHook(_proc);
  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);
        }
    }

private delegate IntPtr LowLevelKeyboardProc(
    int nCode, IntPtr wParam, IntPtr lParam);

private static IntPtr HookCallback(
    int nCode, IntPtr wParam, IntPtr lParam)
{



    Keys keyName;
    bool validKey;
    int vkCode = Marshal.ReadInt32(lParam);
    keyName = (Keys)vkCode;
    validKey = monitorKeys.Contains(keyName.ToString()); //checks if the current key is in our list of keys to monitor



    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {

        vkCode = Marshal.ReadInt32(lParam);
        keyName = (Keys)vkCode;



       if (validKey && keyName == Keys.Enter && altActive == false && ctrlActive == false)
        {


            char c = new char();
            c = KeyConvertor.ToAscii(keyName);
            }

            displayBuffer += c.ToString();

//do some db lookups on the current word here



            lblBuffer.Text = displayBuffer;

            return (IntPtr)1; //no key is sent to program This only works about half the time even though (IntPtr)1 is being returned.

        }


        return CallNextHookEx(_hookID, nCode, wParam, lParam); //key is passed on to program
        }

    }

    else if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP)
    {


        //trap the key
        return (IntPtr)1;

    }

    return CallNextHookEx(_hookID, nCode, wParam, lParam); //key is passed on to program
}