2

好吧,我现在很困惑。 在我的最后一个问题有几个人评论将 bool 更改为 uint 之后,我通过以下方式验证了它们的大小相同:

    Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool)));
    Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint)));

当然打印:

sizeof bool = 4
sizeof uint = 4

话虽如此,然后我还是崩溃了,并尝试了他们的建议……将结构内的单个 bool 更改为 uint。我一生无法弄清楚的是为什么这使它起作用...

所以这有效:

[StructLayout(LayoutKind.Sequential)]
public struct KEY_EVENT_RECORD
{
    public bool bKeyDown;
    public short wRepeatCount;
    public short wVirtualKeyCode;
    public short wVirtualScanCode;
    public char UnicodeChar;
    public int dwControlKeyState;
}

在此结构中使用时:

[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
    [FieldOffset(0)] public short EventType;
    [FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
}

但在这种结构中,它打破了:

[StructLayout(LayoutKind.Explicit)]
public struct INPUT_RECORD
{
    [FieldOffset(0)] public short EventType;
    [FieldOffset(4)] public KEY_EVENT_RECORD KeyEvent;
    [FieldOffset(4)] public MOUSE_EVENT_RECORD MouseEvent;
    [FieldOffset(4)] public WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
    [FieldOffset(4)] public MENU_EVENT_RECORD MenuEvent;
    [FieldOffset(4)] public FOCUS_EVENT_RECORD FocusEvent;
}

然而,当我在结构中将 bool bKeyDown 更改为 uint 时,KEY_EVENT_RECORD它又开始工作了......

有人可以解释这种行为吗?

我真的很想知道它的原因,以便将来可以避免这个未记录的功能(又名错误)。

4

3 回答 3

2

尝试将字段类型设置为 bool 并添加属性 [MarshalAs(UnmanagedType.Bool)]。

[StructLayout(LayoutKind.Sequential)]
public struct KEY_EVENT_RECORD
{
    [MarshalAs(UnmanagedType.Bool)]
    public bool bKeyDown;
    public short wRepeatCount;
    public short wVirtualKeyCode;
    public short wVirtualScanCode;
    public char UnicodeChar;
    public int dwControlKeyState;
}

MarshalAsAttribute的文档UnmanagedType的 文档

于 2009-10-21T19:17:27.217 回答
0

bools 是 1byte --> sizeof (C# Reference)

另请参阅布尔类型的默认封送处理

于 2009-10-21T21:04:42.663 回答
0

用新样本改写的问题:

带有 LayoutKind.Explicit 的布尔编组,这是按设计破坏还是失败?

于 2009-11-09T21:28:24.933 回答