C # e Setas

votos
19

Eu sou novo para C # e estou fazendo algum trabalho em um aplicativo existente. Eu tenho uma janela DirectX que tem componentes nele que eu quero ser capaz de posicionar usando teclas de seta.

Atualmente estou substituindo ProcessCmdKey e captura de entrada seta e enviar um evento OnKeyPress. Isso funciona, mas eu quero ser capaz de usar modificadores ( ALT+ CTRL+SHIFT ). Assim que eu estou segurando um modificador e pressione uma seta há eventos são acionados que estou ouvindo.

Alguém tem alguma idéia ou sugestão sobre onde eu deveria ir com isso?

Publicado 07/08/2008 em 16:23
fonte usuário
Em outras línguas...                            


2 respostas

votos
10

Dentro de seu ProcessCmdKey substituído como você determinar qual tecla foi pressionada?

O valor de keyData (o segundo parâmetro) mudará dependente da tecla pressionada e quaisquer teclas modificadoras, assim, por exemplo, pressionando a seta para a esquerda retorna um código 37, deslocar-esquerda voltará 65573, ctrl-deixou 131109 e alt-esquerda 262181.

Você pode extrair os modificadores e a tecla pressionada por AND, com valores enum apropriadas:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shiftPressed = (keyData & Keys.Shift) != 0;
    Keys unmodifiedKey = (keyData & Keys.KeyCode);

    // rest of code goes here
}
Respondeu 07/08/2008 em 18:38
fonte usuário

votos
6

I upvoted resposta de Tokabi , mas para comparar chaves há alguns conselhos adicionais sobre StackOverflow.com aqui . Aqui estão algumas funções que eu usei para ajudar a simplificar tudo.

   public Keys UnmodifiedKey(Keys key)
    {
        return key & Keys.KeyCode;
    }

    public bool KeyPressed(Keys key, Keys test)
    {
        return UnmodifiedKey(key) == test;
    }

    public bool ModifierKeyPressed(Keys key, Keys test)
    {
        return (key & test) == test;
    }

    public bool ControlPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Control);
    }

    public bool AltPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Alt);
    }

    public bool ShiftPressed(Keys key)
    {
        return ModifierKeyPressed(key, Keys.Shift);
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (KeyPressed(keyData, Keys.Left) && AltPressed(keyData))
        {
            int n = code.Text.IndexOfPrev('<', code.SelectionStart);
            if (n < 0) return false;
            if (ShiftPressed(keyData))
            {
                code.ExpandSelectionLeftTo(n);
            }
            else
            {
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        else if (KeyPressed(keyData, Keys.Right) && AltPressed(keyData))
        {
            if (ShiftPressed(keyData))
            {
                int n = code.Text.IndexOf('>', code.SelectionEnd() + 1);
                if (n < 0) return false;
                code.ExpandSelectionRightTo(n + 1);
            }
            else
            {
                int n = code.Text.IndexOf('<', code.SelectionStart + 1);
                if (n < 0) return false;
                code.SelectionStart = n;
                code.SelectionLength = 0;
            }
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
Respondeu 09/01/2010 em 16:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more