Cómo capturar pulsaciones de teclas en controles utilizando Visual C#

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte 320583 .

EN ESTA TAREA

Resumen

En este artículo paso a paso se muestra cómo capturar pulsaciones de teclas en controles de formularios Windows Forms. Utilizando el código de ejemplo en este artículo, puede interceptar cualquier pulsación de tecla individual. También puede interceptar combinaciones de teclas como CTRL y ALT. Esta técnica no captura la tecla Impr Pant. Además, no se capturen algunas pulsaciones en teclas adicionales, como las teclas que controlan un explorador Web o un Reproductor de CD-ROM.

Para la mayoría de los propósitos, los eventos KeyUp, KeyDowny KeyPress estándar son suficientes para capturar y tratar las pulsaciones de teclas. Sin embargo, no todos los controles activan estos eventos para todas las pulsaciones de teclas en todas las condiciones.

Por ejemplo, considere el control DataGrid : si no se ha asignado ningún dato a la cuadrícula, las teclas de dirección (flecha izquierda, flecha derecha, flecha arriba y flecha abajo) sólo activan el evento KeyUp . Otras teclas, por ejemplo, A ó 4, activan los tres eventos. Si el control DataGrid está mostrando datos, ninguno de los eventos de teclado estándar se provocan para las teclas de desplazamiento. Las pulsaciones como A ó 4 no activan ningún evento, elevar sólo KeyUpo activan los tres eventos, dependiendo de lo que está seleccionado en el control. En estas situaciones, puede seguir los pasos de este artículo para capturar pulsaciones de teclas, independientemente del estado del control.

Los ejemplos de código en este artículo se escriben para trabajar con el control DataGrid, porque el control DataGrid es el control para el que se solicita con más frecuencia esta característica. Puede utilizar el mismo enfoque con otros controles. NET.

Configurar la captura de clave

Para capturar las pulsaciones de teclas en un control de formularios Windows Forms, debe derivar una nueva clase que se basa en la clase del control que desee y suplantar el método ProcessCmdKey . En este método reemplazado, coloque el código para procesar las pulsaciones de teclas que desee capturar. El código de ejemplo siguiente es un ejemplo de la estructura básica de esta clase:

class MyDataGrid : System.Windows.Forms.DataGrid{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
}
}


Implementar el método suplantado

El sistema pasa dos parámetros al método ProcessCmdKey : msg y keyData. El parámetro msg contiene el mensaje de Windows, por ejemplo, WM_KEYDOWN. El parámetro keyData contiene el código de la tecla que se presionó. Si también se presionó CTRL o ALT, el parámetro keyData contiene la información de ModifierKey.

Uso del parámetro msg no es obligatorio; puede ignorarlo. Es buena práctica, sin embargo, probar el mensaje. En este ejemplo, se prueba WM_KEYDOWN para comprobar que se trata de un evento de pulsación de tecla. También se prueba WM_SYSKEYDOWN, por lo que es posible capturar combinaciones de teclas que incluyan teclas de control (principalmente ALT y CTRL).

Para capturar teclas específicas, puede evaluar el valor de keyCode comparándola con la enumeración Keys . El ejemplo de código siguiente muestra cómo capturar las pulsaciones de tecla flecha arriba, flecha abajo, TAB, CTRL+M y ALT+Z:

const int WM_KEYDOWN = 0x100;const int WM_SYSKEYDOWN = 0x104;

if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch(keyData)
{
case Keys.Down:
Console.WriteLine("Down Arrow Captured");
break;

case Keys.Up:
Console.WriteLine("Up Arrow Captured");
break;

case Keys.Tab:
Console.WriteLine("Tab Key Captured");
break;

case Keys.Control | Keys.M:
Console.WriteLine("<CTRL> + m Captured");
break;

case Keys.Alt | Keys.Z:
Console.WriteLine("<ALT> + z Captured");
break;
}
}


Compilar un ejemplo

En el ejemplo siguiente se muestra cómo capturar pulsaciones de teclas con el control DataGrid .

  1. Cree un nuevo proyecto de biblioteca de controles de Windows en Visual C#.
  2. Ver las propiedades de la clase UserControl1y, a continuación, cambie el nombre por MiDataGrid.
  3. Ver el código de la biblioteca de Control y, a continuación, cambie la siguiente línea de código
    public class MyDataGrid : System.Windows.Forms.UserControl
    a la siguiente:
    public class MyDataGrid : System.Windows.Forms.DataGrid
    Note In Visual Studio 2005 or Visual Studio 2008, change the following line of code:
    public partial class MyDataGrid : System.Windows.Forms.DataGrid 
  4. Agregue el método siguiente a la clase MiDataGrid :
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData){
    const int WM_KEYDOWN = 0x100;
    const int WM_SYSKEYDOWN = 0x104;

    if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
    {
    switch(keyData)
    {
    case Keys.Down:
    this.Parent.Text="Down Arrow Captured";
    break;

    case Keys.Up:
    this.Parent.Text="Up Arrow Captured";
    break;

    case Keys.Tab:
    this.Parent.Text="Tab Key Captured";
    break;

    case Keys.Control | Keys.M:
    this.Parent.Text="<CTRL> + M Captured";
    break;

    case Keys.Alt | Keys.Z:
    this.Parent.Text="<ALT> + Z Captured";
    break;
    }
    }

    return base.ProcessCmdKey(ref msg,keyData);
    }

  5. Genere el proyecto.
  6. Cree un nuevo proyecto de aplicación Windows en Visual C#. De forma predeterminada, se crea un formulario denominado Form1.
  7. En el menú Herramientas , haga clic en Personalizar cuadro de herramientas

    Nota: En Visual Studio 2005 o Visual Studio 2008, haga clic en Elegir elementos del cuadro de herramientas.
  8. Haga clic en la ficha Componentes de.NET Framework .
  9. Haga clic en Examinar, busque el control o biblioteca DLL recién creada y, a continuación, haga clic en Aceptar.
  10. El control MyDataGrid aparece ahora en el cuadro de herramientas. Coloque uno en Form1. Nota: puede utilizar el código en los pasos restantes para crear datos de ejemplo en la cuadrícula para mostrar.

  11. Agregue el código siguiente al espacio de nombres del formulario. Puede colocar el código antes o después de la definición de clase del formulario.
    // This structure is only used in providing sample data for the grid.public struct gridData
    {
    private string make;
    private int year;

    public gridData(string n,int y)
    {
    make=n;
    year=y;
    }

    public string Make
    {
    get{return make;}
    set{make = value;}
    }

    public int Year
    {
    get{return year;}
    set{year=value;}
    }
    }

  12. Agregue el código siguiente a la clase de formulario inmediatamente después de la sección "Código generado por el Diseñador de Windows Forms":
    protected gridData[] dataArray=new gridData[5];
  13. Agregue el código siguiente al evento Load de Form1:
    // Create some sample data.dataArray[0]=new gridData("ford",1999);
    dataArray[1]=new gridData("chevrolet",1999);
    dataArray[2]=new gridData("plymouth",1988);
    dataArray[3]=new gridData("honda",1999);
    dataArray[4]=new gridData("fiat",1987);

    // Assign the data to the grid.
    myDataGrid1.DataSource=dataArray;

  14. Ejecute el ejemplo y pruebe las diversas pulsaciones de teclas que están siendo capturados (flecha arriba, flecha abajo, TAB, CTRL+M y ALT+Z). El título del formulario se actualiza para mostrar la tecla que se presionó.
Propiedades

Id. de artículo: 320584 - Última revisión: 17 ene. 2017 - Revisión: 2

Comentarios