如何使用SendInput()将密钥发送到DirectX应用程序?

问题描述 投票:1回答: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。有谁知道我该怎么做才能使它正常工作?

非常感谢

c# directx sendinput
1个回答
0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.