首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在运行时设置StructLayout的大小属性吗?

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

Stack Overflow用户
提问于 2010-08-18 02:53:58
回答 2查看 1.5K关注 0票数 2

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

我已经决定要让它工作,我需要有两个不同的输入结构

代码语言:javascript
复制
        [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结构,并根据机器确定大小和字段偏移量。

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

代码语言:javascript
复制
#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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-18 03:08:25

很遗憾,我不会。

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-07-11 16:10:55

你可以总是有两个结构,并决定在运行时使用哪一个。

如果设计得当,您可以将代码复制限制在几行之内。(加上拥有两次结构。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3505889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档