我正在尝试使用SendInput在我的应用程序中模拟键盘按压,并希望同时支持32位和64位。
我已经决定要让它工作,我需要有两个不同的输入结构
[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;
}发布于 2010-08-18 03:08:25
很遗憾,我不会。
属性在编译时被“融合”到类型,这就是为什么传递给属性构造函数的所有值都必须是常量的原因。
在运行时,您不能修改附加到该类型的属性。您可以获取一个副本并修改它的值,但是附加到类型的实际属性将保持不变,因此您也不能“欺骗”mscorlib代码来看到您的更改而不是原始的更改。
发布于 2012-07-11 16:10:55
你可以总是有两个结构,并决定在运行时使用哪一个。
如果设计得当,您可以将代码复制限制在几行之内。(加上拥有两次结构。)
https://stackoverflow.com/questions/3505889
复制相似问题