在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
而不是使用全局钩子来记录击键?对于您的应用程序,它可能就足够了,有很多完全实现的示例,并且个人更容易实现。
- 3 回答
- 0 关注
- 949 浏览
添加回答
举报
0/150
提交
取消