C# I';I’我想通过SendInput API发送一些密钥
我想通过C#上的SendInput API发送一些游戏密钥。(我的环境是Windows 7 64位) 我写了一些代码如下:C# I';I’我想通过SendInput API发送一些密钥,c#,windows,winapi,C#,Windows,Winapi,我想通过C#上的SendInput API发送一些游戏密钥。(我的环境是Windows 7 64位) 我写了一些代码如下: 但是,它不能正常工作 显然,此代码可以将退格发送到游戏。事实上,此代码可以删除Notepad.exe上的字符 奇怪的是,这段代码只向应用程序发送退格。我更改了此代码中的键码(我尝试了0x14、0x13、0x12…等)但是,此代码只发送退格 我想发送另一个密钥(J、K、L…等)到应用程序,但我不能 有什么建议吗? 谢谢请记住,按键事件包括按键向下和之后的按键向上事件。这意
但是,它不能正常工作
显然,此代码可以将退格发送到游戏。事实上,此代码可以删除Notepad.exe上的字符
奇怪的是,这段代码只向应用程序发送退格。我更改了此代码中的键码(我尝试了0x14、0x13、0x12…等)但是,此代码只发送退格
我想发送另一个密钥(J、K、L…等)到应用程序,但我不能
有什么建议吗?
谢谢请记住,按键事件包括按键向下和之后的按键向上事件。这意味着要“发送退格”,您需要调用SendInput两次,一次按键,一次按键释放。
如果您未能在按键释放的情况下调用SendInput,大多数应用程序很可能会忽略后续按键操作。在调用
SendInput
之前,inputs[0].ki.wScan
的值是多少?MapVirtualKey
函数是否成功,或返回0?您正在混淆虚拟键和扫描代码。虚拟键0x15仅在日文键盘上可用。然而,0x15是退格键的扫描代码。请考虑使用.NET sEdKEdk类。谢谢您的建议。我尝试使用.NET SendKeys类,但是,我无法向游戏发送密钥。很可能,游戏使用DirectInput,因此我认为我必须使用SendInputs之类的低级API。MapVirtualKey函数返回0这就是为什么检查返回值很重要的原因。如果MapVirtualKey
返回0,则表示没有从要传递给扫描代码的虚拟密钥代码进行翻译。这一点从“返回值”部分中可以清楚地看到。由于该函数不起作用,因此对SendInput
的调用不起作用。
[DllImport("user32.dll")]
static extern int SendInput(int nInputs, INPUT[] pInputs, int cbSize);
[StructLayout(LayoutKind.Sequential)]
private struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public short wVk;
public short wScan;
public int dwFlags;
public int time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct HARDWAREINPUT
{
public uint uMsg;
public ushort wParamL;
public ushort wParamH;
}
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public HARDWAREINPUT hi;
}
public static void WalkFront()
{
INPUT[] inputs = new INPUT[1];
Keys virtualKeycode = (Keys)0x15;
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = (short)virtualKeycode;
inputs[0].ki.wScan = (short)MapVirtualKey((int)virtualKeycode, 0);
inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE;
inputs[0].ki.time = 0;
inputs[0].ki.dwExtraInfo = GetMessageExtraInfo();
SendInput(1, inputs, Marshal.SizeOf(inputs[0]));
}