C# I';I’我想通过SendInput API发送一些密钥

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…等)到应用程序,但我不能 有什么建议吗? 谢谢请记住,按键事件包括按键向下和之后的按键向上事件。这意

我想通过C#上的SendInput API发送一些游戏密钥。(我的环境是Windows 7 64位)

我写了一些代码如下:

但是,它不能正常工作

显然,此代码可以将退格发送到游戏。事实上,此代码可以删除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]));        
    }