gpt4 book ai didi

.net - SendInput和64位

转载 作者:行者123 更新时间:2023-12-04 03:13:10 26 4
gpt4 key购买 nike

以下摘录了一些我用来通过SendInput API模拟按键的代码。如果我将我的应用程序设置为针对x86 CPU进行编译,则此方法可以正常工作,但不适用于x64 CPU编译。

我猜想它与x64使用双倍大小的指针有关,但是我试图将[FieldOffset(4)]更改为[FieldOffset(8)],但是没有用。

这可能与导入user32.dll的32位版本有关吗?

    #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 INPUT
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public KEYBDINPUT ki;
};

#endregion

public void sendKey(KeyCode Key)
{
INPUT[] InputList = new INPUT[2];

INPUT keyInput = new INPUT();
keyInput.type = 1;

keyInput.ki.wScan = 0;
keyInput.ki.time = 0;
keyInput.ki.dwFlags = (int)KeyEvent.KeyDown;
keyInput.ki.dwExtraInfo = (uint)GetMessageExtraInfo();
keyInput.ki.wVk = (ushort)Key;

InputList[0] = keyInput;

keyInput.ki.dwFlags = (int)KeyEvent.KeyUp;

InputList[1] = keyInput;

SendInput((uint)2, InputList, Marshal.SizeOf(InputList[0]));
}

最佳答案

除了SLaks识别出的错误之外,您剩下的问题还在于INPUT的大小不正确。这意味着SendInput失败,因为它接收到类型为INPUT[]的参数。您不能使用StructLayout(LayoutKind.Explicit, Size = 28)指定大小,因为您想要同时处理x86和x64的代码。

这一切都源于您只在KEYBRDINPUT中包括了INPUT结构的事实。 MOUSEINPUT结构大于KEYBRDINPUT,这是造成问题的原因。

最好的解决方案是正确定义INPUT结构,包括并集部分。这样做(声明来自pinvoke.net)。

[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}

[StructLayout(LayoutKind.Sequential)]
struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}

[StructLayout(LayoutKind.Sequential)]
struct HARDWAREINPUT
{
public int uMsg;
public short wParamL;
public short wParamH;
}

[StructLayout(LayoutKind.Explicit)]
struct MouseKeybdHardwareInputUnion
{
[FieldOffset(0)]
public MOUSEINPUT mi;

[FieldOffset(0)]
public KEYBDINPUT ki;

[FieldOffset(0)]
public HARDWAREINPUT hi;
}

[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public uint type;
public MouseKeybdHardwareInputUnion mkhi;
}

关于.net - SendInput和64位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6830651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com