質問

さて、私は今非常に混乱しています。 私の最後の質問の後、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

とはいえ、それから私は決裂し、とにかく彼らの提案を試してみました...構造内の単一のブールを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;
}

まだ KEY_EVENT_RECORD 構造体でbool bKeyDownをuintに変更すると、再び動作を開始します...

誰かがこの動作を説明してもらえますか?

この文書化されていない機能(バグ)を将来回避できるように、その理由を本当に知りたいです。

他のヒント

フィールドタイプを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

のドキュメント
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top