Eventos de teclas de seta não chegando

Basicamente, eu tenho um formulário com um controle personalizado (e nada mais). O controle personalizado está completamente vazio e o formulário tem KeyPreview definido como true.

Com esta configuração, não estou recebendo nenhum evento KeyDown para nenhuma tecla de seta ou tab. Todas as outras teclas que tenho no meu teclado funcionam. Eu tenho manipuladores de eventos do KeyDown conectados a tudo o que tem esses eventos, portanto, tenho certeza de que não estou perdendo nada.

Também é importante notar que, se eu remover o controle personalizado (completamente vazio), recebo os eventos das teclas de seta.

o que esta acontecendo aqui?

EDITAR:

Adicionei isso ao formulário e ao controle, mas ainda não estou obtendo as teclas de seta:

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
        case 0x100: //WM_KEYDOWN
            //this is the control's version. In the form, it's this.Text
            ParentForm.Text = ((Keys)m.WParam).ToString();
            break;
    }
    base.WndProc(ref m);
}

Também verifiquei com o Spy ++ e determinei que o formulário em si não está recebendo nenhuma mensagem WM_KEYDOWN, todos eles estão indo para o controle. No entanto, dito isso, o controle está recebendo as mensagens WM_KEYDOWN da tecla de seta. Suspiro.

Edição 2: Também atualizei o arquivo ZIP com esta versão. Por favor, olhe para ele, se você quiser ajudar ...

Edição 3:

Eu descobri isso, mais ou menos. O formulário está comendo as setas do teclado, provavelmente na tentativa de manter o foco entre seus filhos. Isso é comprovado pelo fato de eu receber os eventos se o formulário estiver vazio.

De qualquer forma, se eu adicionar esse código ao formulário, começo a receber os eventos novamente:

public override bool PreProcessMessage(ref Message msg) {
    switch (msg.Msg) {
        case 0x100: //WM_KEYDOWN
            return false;
    }
    return base.PreProcessMessage(ref msg);
}

Quando eu substituo isso, o formulário não tem a chance de fazer seu trabalho sujo e, portanto, recebo meus eventos KeyDown conforme o esperado. Suponho que um efeito colateral disso é que não posso mais usar meu teclado para navegar no formulário (não é grande coisa nesse caso, pois é um jogo, e todo o objetivo deste exercício é implementar a navegação pelo teclado!)

Ainda permanece a pergunta sobre como desativar isso "corretamente", se houver uma maneira ...

questionAnswers(2)

yourAnswerToTheQuestion