好吧,我现在很困惑。 在我的最后一个问题有几个人评论将 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
它又开始工作了......
有人可以解释这种行为吗?
我真的很想知道它的原因,以便将来可以避免这个未记录的功能(又名错误)。