none
Capturar tecla enter em um form - protected override bool ProcessCmdKey RRS feed

  • Pergunta

  • A única maneira que encontrei de pegar o evento da tecla enter num form foi:

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
          if (keyData == Keys.Enter)
            Console.WriteLine("enter!");
    }
    

    O evento  private void Form1_KeyDown(object sender, KeyEventArgs e) não é disparado com a tecla enter.. Não sei pq!

    1. Essa maneira que eu fiz esta correta?

    2. Onde está o evento original que eu dei override?

    • Movido Rui SantosModerator quarta-feira, 10 de novembro de 2010 17:28 (De:.NET Development - Geral)
    quarta-feira, 10 de novembro de 2010 17:19

Respostas

  • Oq ele fez nao resolve o problema.

    Pelo visto a única solução eh:

    protected
     override
     bool
     ProcessCmdKey(ref
     Message msg, Keys keyData)
    • Marcado como Resposta PedroDD quinta-feira, 11 de novembro de 2010 11:17
    quinta-feira, 11 de novembro de 2010 11:17

Todas as Respostas

  • Deusiro,

    Você pode usar o KeyDown, porem você deve setar a propriedade KeyPreview do form para True.

    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quarta-feira, 10 de novembro de 2010 17:24
    Moderador
  • Ola,

         Estou movendo a sua pergunta para o forum referente às questoes de Widows Forms.... 


    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quarta-feira, 10 de novembro de 2010 17:28
    Moderador
  • Ja sei pq tive problemas, se um botão estiver selecionado o enter não é mais capturado, ele clica o botão antes. Só usando o override .. Aliás ninguem explicou ele.
    quarta-feira, 10 de novembro de 2010 19:26
  • Segue a sua explicação sobre o ProcessCmdKey:

    "Esse método é chamado durante a pré-processamento de mensagem para Identificador Chaves de comando. Teclas de comando são chaves sempre têm precedência sobre as chaves de entrada regulares. Exemplos de teclas de comando Incluir aceleradores e menus de atalho. O método deve Retorno true para indicar que processou a chave de comando ou false para indicar que a chave não é um comando chave. Esse método é chamado Apenas quando o controle está hospedado em um aplicativo Janelas Formulários ou sistema autônomo um Controle do ActiveX.

    O ProcessCmdKey método primeiro determina se o controle possui uma ContextMenu e em caso afirmativo, permite que o ContextMenu para processar a chave de comando. Se a chave de comando não é um atalho do menu e o controle tem um pai, a chave é Passado para ProcessCmdKey método. do pai O resultado é que as chaves são "bubbled" superiores da hierarquia de controle de comando. Juntamente com a chave que o usuário pressionou, sistema autônomo Dadsistema autônomodsistema autônomo Dadsistema autônomo chave indicam também que, se Qualquer, sistema autônomo teclsistema autônomo modificadorsistema autônomo foram pressionaDadsistema autônomos ao mesmo Hora, como a chave. Teclas modificadoras incluem Chaves deslocar, CTRL e ALT.

    Observações para herdeiros

    Ao substituir o ProcessCmdKey método em uma classe derivada, um controle deve Retorno true para indicar que tiver processado a chave. Para as chaves que não são processadas pelo controle, o resultado da chamada ProcessCmdKey método deve ser retornado. Controles raramente, se nunca, precisará substituir esse método."

    Fonte: http://msdn.microsoft.com/pt-br/library/system.windows.forms.control.processcmdkey.aspx


    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quarta-feira, 10 de novembro de 2010 20:59
    Moderador
  • Apropriedade "KeyPreview" do form serve justamente para que primeiro vc processe as informações de key no form e depois nos controls...

    Da uma olhada no link informado pelo Rógerio


    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quarta-feira, 10 de novembro de 2010 21:01
    Moderador
  • Deusiro,

    Você pode usar o KeyDown, porem você deve setar a propriedade KeyPreview do form para True.

    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    Eu setei essa propriedade para true no construtor do form, e mesmo assim ele não pega a tecla enter se um botão estiver selecionado. Ele clica no botão mas nao pega o evento de keydown.
    quinta-feira, 11 de novembro de 2010 10:37
  • Obrigado pela explicacao, agora essa tradução para PT do msdn eh TERRÍVEL! Olha isso... Deviam botar essa traducao como segunda opcao, primeiro mostrar em ingles.. Credo
    quinta-feira, 11 de novembro de 2010 10:39
  • Pedro,

    Pelo que vi, este é um funcionamento padrão, você teria que fazer um tratamento para não executar o click do botão, confira este post:

    http://social.msdn.microsoft.com/forums/en-US/Vsexpressvcs/thread/ba7e2fa6-aaca-4722-a11e-5309435c1553

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 11 de novembro de 2010 11:14
    Moderador
  • Oq ele fez nao resolve o problema.

    Pelo visto a única solução eh:

    protected
     override
     bool
     ProcessCmdKey(ref
     Message msg, Keys keyData)
    • Marcado como Resposta PedroDD quinta-feira, 11 de novembro de 2010 11:17
    quinta-feira, 11 de novembro de 2010 11:17
  • Obrigado pela explicacao, agora essa tradução para PT do msdn eh TERRÍVEL! Olha isso... Deviam botar essa traducao como segunda opcao, primeiro mostrar em ingles.. Credo

    Entao... isso é configuravel :P aqui primeiro vem em ingles.... mas nem lembro mais onde mexi para arrumar isso...

    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    quinta-feira, 11 de novembro de 2010 13:58
    Moderador
  • Configure a propriedade KeyPreview do formulário que irá capturar o evento da tecla "ENTER - (Return)" como true.

    Agora é só verificar se a tecla pressionada pelo usuário foi a tecla "ENTER - (Return)", através do evento KeyDown do formulário. Este evento é disparado toda vez que o usuário pressiona uma tecla

    private void Form1_KeyDown(object sender, KeyEventArgs e)

    {   

    if (e.KeyCode == Keys.Enter){

    Console.WriteLine("Tecla enter pressionada!");

    }

    }

    Fontes:

    http://msdn.microsoft.com/pt-br/library/system.windows.forms.keys(v=vs.110).aspx

    http://msdn.microsoft.com/pt-br/library/system.windows.forms.keyeventargs(v=vs.110).aspx




    • Editado Heliton Junior quinta-feira, 18 de setembro de 2014 21:05 Inserção das fontes consultadas.
    quinta-feira, 18 de setembro de 2014 20:58