猿问

在WPF / C#中使用全局键盘钩子(WH_KEYBOARD_LL)

在WPF / C#中使用全局键盘钩子(WH_KEYBOARD_LL)

我从我在互联网上发现的代码中找到了自己的WH_KEYBOARD_LL帮助类:

将以下代码放到一些utils库中,让它成为YourUtils.cs

using System;using System.Diagnostics;using System.Runtime.InteropServices;using System.Runtime.CompilerServices;using System.Windows.Input;namespace MYCOMPANYHERE.WPF.KeyboardHelper{
    public class KeyboardListener : IDisposable
    {
        private static IntPtr hookId = IntPtr.Zero;

        [MethodImpl(MethodImplOptions.NoInlining)]
        private IntPtr HookCallback(
            int nCode, IntPtr wParam, IntPtr lParam)
        {
            try
            {
                return HookCallbackInner(nCode, wParam, lParam);
            }
            catch
            {
                Console.WriteLine("There was some error somewhere...");
            }
            return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);
        }

        private IntPtr HookCallbackInner(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                if (wParam == (IntPtr)InterceptKeys.WM_KEYDOWN)
                {
                    int vkCode = Marshal.ReadInt32(lParam);

                    if (KeyDown != null)
                        KeyDown(this, new RawKeyEventArgs(vkCode, false));
                }
                else if (wParam == (IntPtr)InterceptKeys.WM_KEYUP)
                {
                    int vkCode = Marshal.ReadInt32(lParam);

                    if (KeyUp != null)
                        KeyUp(this, new RawKeyEventArgs(vkCode, false));
                }
            }
            return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam);
        }

    }

问题是它在按键一段时间后停止工作。什么都没有出现错误,我只是暂时没有得到任何输出。当它停止工作时我找不到坚固的图案。

再现这个问题很简单,就像一个疯子一样打了一些钥匙,通常在窗外。

我怀疑背后有一些邪恶的线程问题,任何人都知道如何保持这种工作?


12345678_0001
浏览 950回答 3
3回答

白衣非少年

IIRC,当使用全局钩子时,如果你的DLL没有足够快地从回调中返回,你就会从回调链中删除。因此,如果你说它的工作有点但是如果你输入太快它会停止工作,我可能会建议只将密钥存储在内存中的某些位置并稍后转储密钥。例如,您可能会检查某些键盘记录程序的来源,因为它们使用相同的技术。虽然这可能无法直接解决您的问题,但至少应该排除一种可能性。您是否考虑使用GetAsyncKeyState而不是使用全局钩子来记录击键?对于您的应用程序,它可能就足够了,有很多完全实现的示例,并且个人更容易实现。
随时随地看视频慕课网APP
我要回答