gpt4 book ai didi

c# - 我可以在运行时设置 StructLayout 的大小属性吗?

转载 作者:行者123 更新时间:2023-11-30 21:20:01 26 4
gpt4 key购买 nike

我正在尝试使用 SendInput 在我的应用程序中模拟键盘按下,并希望同时支持 32 位和 64 位。

我已经确定要使其工作,我需要有 2 个不同的 INPUT 结构

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

[StructLayout(LayoutKind.Explicit, Size = 28)]
public struct INPUT32
{
[FieldOffset(0)]
public uint type; // eg. INPUT_KEYBOARD
[FieldOffset(4)]
public KEYBDINPUT ki;
}

[StructLayout(LayoutKind.Explicit, Size = 40)]
public struct INPUT64
{
[FieldOffset(0)]
public uint type; // eg. INPUT_KEYBOARD
[FieldOffset(8)]
public KEYBDINPUT ki;
}

我想知道是否有一种方法可以在运行时设置 StructLayout 大小和 FieldOffsets,这样我就可以只使用一个 INPUT 结构并根据机器确定大小和场偏移量。

我已经尝试了下面的代码,但我想知道在运行时而不是编译时是否可以这样做。

#if _M_IX86
[StructLayout(LayoutKind.Explicit, Size = 28)]
#else
[StructLayout(LayoutKind.Explicit, Size = 40)]
#endif
public struct INPUT
{
[FieldOffset(0)]
public uint type; // eg. INPUT_KEYBOARD
#if _M_IX86
[FieldOffset(4)]
#else
[FieldOffset(8)]
#endif
public KEYBDINPUT ki;
}

最佳答案

很遗憾,没有。

属性在编译时“融合”到类型,这就是为什么传递给属性构造函数的所有值都必须是常量的原因。

并且在运行时您不能修改附加到类型的属性。您可以获取副本 并修改其值,但附加到该类型的实际属性将保持不变,因此您也不能“欺骗”mscorlib 代码以查看您的更改而不是原始的。

关于c# - 我可以在运行时设置 StructLayout 的大小属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3505889/

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