わかりました、私は今非常に混乱しています。 私の最後の質問の後、 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
再び機能し始めます...
誰かがこの動作を説明できますか?
将来、この文書化されていない機能 (別名バグ) を回避できるように、その理由を知りたいです。