2010-08-17 116 views
2

我试图使用SendInput来模拟我的应用程序中的键盘按下,并希望支持32位和64位。我可以在运行时设置StructLayout的size属性吗?

我已经确定了这个工作,我需要有2层不同的输入结构本身

 [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结构,并根据机器确定大小和fieldoffset。

我已经尝试了下面的代码,但我想知道如果在运行时而不是编译时可能是相同的。

#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; 
    } 

回答

3

不幸的是,没有。

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

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

0

您可以始终有2个结构并确定在运行时使用哪一个。

通过适当的设计,您可以将代码重复限制为几行。 (加上结构两次。)

相关问题