下面是我用来通过SendInput API模拟按键的一些代码的摘录.如果我将我的应用程序设置为针对x86 CPU进行编译,则此方法可正常工作,但不适用于x64 CPU编译.
我猜它有一些事情,x64使用双倍大小的指针,但我试图改变这个[FieldOffset(4)],[FieldOffset(8)]但它没有用.
它是否与导入32位版本的user32.dll的事实有关?
#region SendInput API
[DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
[DllImport("user32.dll", EntryPoint = "GetMessageExtraInfo", SetLastError = true)]
static extern IntPtr GetMessageExtraInfo();
private enum KeyEvent
{
KeyUp = 0x0002,
KeyDown = 0x0000,
ExtendedKey = 0x0001
}
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public long time;
public uint dwExtraInfo;
};
[StructLayout(LayoutKind.Explicit, Size = 28)]
private struct …Run Code Online (Sandbox Code Playgroud) 我需要一些关于DirectInput的帮助,我会告诉我想要做什么.当我只按一个键时,我想让我的程序向游戏发送键组合.例子:我将按"r",它将按"1","3","2","4"键.我从这里找到了一些代码.但他们并没有完全奏效.
public static void Send_Key_Hold(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
public static void Send_Key_Release(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码和我的问题:当我使用Send_Key_Hold时,它只按下游戏中的一个键并且没有按下其他组合键,因为我认为第一个键是持久的.当我一起使用Send_Key_Hold和Send_Key_Release时,它不会按下游戏上的任何按钮.但在桌面上(我的意思是任何其他应用程序而不是游戏)它按下键.