为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
12345678_0001 2019-08-26 15:55:02
在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);         }     }问题是它在按键一段时间后停止工作。什么都没有出现错误,我只是暂时没有得到任何输出。当它停止工作时我找不到坚固的图案。再现这个问题很简单,就像一个疯子一样打了一些钥匙,通常在窗外。我怀疑背后有一些邪恶的线程问题,任何人都知道如何保持这种工作?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

IIRC,当使用全局钩子时,如果你的DLL没有足够快地从回调中返回,你就会从回调链中删除。

因此,如果你说它的工作有点但是如果你输入太快它会停止工作,我可能会建议只将密钥存储在内存中的某些位置并稍后转储密钥。例如,您可能会检查某些键盘记录程序的来源,因为它们使用相同的技术。

虽然这可能无法直接解决您的问题,但至少应该排除一种可能性。

您是否考虑使用GetAsyncKeyState而不是使用全局钩子来记录击键?对于您的应用程序,它可能就足够了,有很多完全实现的示例,并且个人更容易实现。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 949 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信