1

我需要将密钥发送到 DirectX 应用程序。我正在尝试使用 SendInput(),因为它听说它是除 DirectInput 钩子之外的最低级别的键模拟。

问题是,它只适用于 Windows 应用程序而没有任何问题,但不适用于 DirectX 应用程序。我正在寻找解决方案,我发现我必须使用 Scancode 而不是 wVk 并将 dwFlags 设置为 0x0008 (scancode)

private static KEYBDINPUT createKeybdInput(ushort wVK, uint flag)
{
    KEYBDINPUT i = new KEYBDINPUT();

    i.wVk = 0;
    i.wScan = wVK;
    i.time = 0;
    i.dwExtraInfo = IntPtr.Zero;
    i.dwFlags = flag | (uint)0x0008;


    return i;
}


public void Keyboardpress()
{
    INPUT[] inp = new INPUT[2];

    inp[0].type = 1;
    inp[0].U.ki = createKeybdInput(0x41, 0x0000);
    inp[1].type = 1;
    inp[1].U.ki = createKeybdInput(0x41, 0x0002);



    if (SendInput(2, inp, Marshal.SizeOf(typeof(INPUT))) == 0)
    {
        new Exception("Error: " + Marshal.GetLastWin32Error().ToString());
    }

}

它应该向最前台窗口发送“a”,但我的 directX 应用程序对此没有反应。我还尝试使用 DirectX 扫描码(在我的情况下为 'a' = 0x1E),仍然没有任何变化。

但是,它应该与 SendInput() 一起使用。我下载了“Glovepie”软件来测试这个程序是否可以模拟游戏的按键。它确实有一种方法可以做到这一点,我认为他们不会进入图书馆。经过一些研究,他们似乎也使用了 SendInput() API。有谁知道我应该怎么做才能让它工作?

非常感谢

4

1 回答 1

0

您的代码的问题在于您发送的是字符“a”(0x41)的虚拟键码,而不是扫描码(0x1E)。

您在 dwFlags 参数中指定您希望发送扫描码。您可以通过两种方式修复代码:

1:从 dwFlags 中删除“0x0008”位,设置 wScan=0 并使用 wVk 发送虚拟键码(在您的示例中为 0x41)。

2:保持您的代码不变,但发送 0x1E 而不是 0x41 以发送“a”的扫描码。

如何从虚拟键码中获取扫码?使用 MapVirtualKey 函数。使用您的示例, MapVirtualKey(0x41,0) 将返回 0x1E 作为扫描码!

于 2020-05-21T14:29:41.423 回答