捕获游戏中的键盘?

Capture the keyboard in the game?

我正在尝试用unity3d做一个按键监听的功能,现在遇到了一些困难。 我的第一个版本的方法是通过hook来实现,一切正常,直到我遇到了英雄联盟,在这个游戏的界面上,我的键盘无法被hook捕获。主要代码如下:

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

public delegate IntPtr LowLevelHookProc(int nCode, IntPtr wParam, IntPtr lParam);

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

接下来,我使用了DirectX输入组件进行监控。同样,英雄联盟界面也没有任何反应。顺便说一句,我正在使用 SharpDX.DirectInput。代码如下:

Keyboard keyboard;

void Start()
{
    var directInput = new DirectInput();
    keyboard = new Keyboard(directInput);
    keyboard.Acquire();
}

void Update()
{
    KeyboardState cur = keyboard.GetCurrentState();
    if (cur.PressedKeys.Count != 0)
    {
        Debug.LogError(cur.ToString());
    }
}

最后我用GetAsyncKeyState来抓取,同样不生效

所以有人知道这是怎么回事吗?这种想象不应该只存在于英雄联盟,也应该存在于其他游戏中。我还没有时间测试它。如果您有任何想法或建议,我将不胜感激!

解决了评论区的问题:

Some high budget games have anti-cheat systems. You have to run your program as administrator in order to do the button monitoring.