我需要将密钥发送到DirectX应用程序。 我正在尝试使用SendInput(),因为它听说它是除DirectInput挂钩以外最低级别的密钥模拟。
问题是,它只适用于Windows应用程序,但不适用于DirectX应用程序。我正在寻找解决方案,我发现我必须使用Scancode而不是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());
}
}
它应该向最前面的窗口发送“a”,但我的directX应用程序不会对此做出反应。我也尝试使用DirectX Scancodes(在我的情况下为'a'= 0x1E),仍然没有变化。
但是,它应该与SendInput()一起使用。我下载了软件“Glovepie”来测试这个程序是否可以模拟游戏的关键。它确实有这样做,我不认为他们挂钩图书馆。经过一些研究后,似乎他们也使用了SendInput()API。有谁知道我该怎么做才能让它发挥作用?
非常感谢
答案 0 :(得分:0)
代码的问题是,您要发送字符“ a”的虚拟键码(0x41),而不是扫描码(0x1E)。
您在dwFlags参数中指定了要发送扫描代码的位置。您可以通过两种方式修复代码:
1:从dwFlags中删除“ 0x0008”位,设置wScan = 0并使用wVk发送虚拟键码(在您的示例中为0x41)。
2:保持代码不变,但发送0x1E而不是0x41来发送“ a”的扫描代码。
如何从虚拟键码获取扫描码?使用MapVirtualKey函数。在您的示例中,MapVirtualKey(0x41,0)将返回0x1E作为扫描代码!