C# 如何使用SendInput()向DirectX应用程序发送密钥?

C# 如何使用SendInput()向DirectX应用程序发送密钥?,c#,directx,sendinput,C#,Directx,Sendinput,我需要向DirectX应用程序发送密钥。 我尝试使用SendInput,因为它听说它是除DirectInput钩子之外的最低级的键模拟 问题是,它只适用于Windows应用程序,而不适用于DirectX应用程序。我正在搜索解决方案,发现我必须使用扫描码而不是wVk,并将dwFlags设置为0x0008扫描码 private static KEYBDINPUT createKeybdInput(ushort wVK, uint flag) { KEYBDINPUT i = new KEYB

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

问题是,它只适用于Windows应用程序,而不适用于DirectX应用程序。我正在搜索解决方案,发现我必须使用扫描码而不是wVk,并将dwFlags设置为0x0008扫描码

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());
    }

}
它应该向最前台的窗口发送一条消息,但我的directX应用程序对此没有反应。我还尝试在“a”=0x1E的情况下使用DirectX扫描码,但仍然没有更改

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


非常感谢

您的代码存在的问题是,您发送的是字符a 0x41的虚拟密钥代码,而不是扫描代码0x1E

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

1:从dwFlags中删除0x0008位,设置wScan=0,并在示例中使用wVk发送虚拟密钥代码0x41

2:保持代码原样,但发送0x1E而不是0x41以发送a的扫描代码


如何从虚拟密钥代码中获取扫描代码?使用MapVirtualKey函数。使用您的示例,MapVirtualKey0x41,0将返回0x1E作为扫描代码

我试图使用SPY++监视directx应用程序,但它没有找到任何消息。应用程序似乎使用DirectInput。如何使用directinput向directx应用程序发送密钥?我听说directinput只检测按键,但不模拟按键:出于某种原因,它似乎与keybd_事件一起工作