Pergunta

Ok, agora estou muito confuso. Depois da minha última pergunta tinha várias pessoas comentário sobre a mudança bool para uint verifiquei que eles são do mesmo tamanho por:

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

Qual das impressões do curso:

sizeof bool = 4
sizeof uint = 4

Dito isso, eu, em seguida, quebrou e deu suas sugestões uma tentativa de qualquer maneira ... Mudando um único bool dentro de uma estrutura para um uint. O que eu não consigo descobrir para a vida de mim é porque este fez o trabalho ...

Então, isso funciona:

[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;
}

Quando usado desta estrutura:

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

Mas nesta estrutura de quebra:

[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;
}

No entanto, quando eu mudar bool bKeyDown para uint na estrutura KEY_EVENT_RECORD ele começa a trabalhar de novo ...

Alguém pode explicar esse comportamento?

Eu realmente gostaria de saber o porquê dele para que eu possa evitar este recurso não documentado (aka bug) no futuro.

Foi útil?

Outras dicas

Tente configurar o tipo de campo para bool e adicionar o atributo [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 Docs para UnmanagedType

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top