teclas tecla saber que pulsadas presiono oemcomma keys keychar como codigo clase capturar c# user-interface directx

saber - tecla backspace c#



C#y teclas de flecha (2)

Soy nuevo en C # y estoy trabajando en una aplicación existente. Tengo una ventana gráfica de DirectX que tiene componentes que quiero ubicar con las teclas de flecha.

Actualmente estoy anulando ProcessCmdKey y capturando entrada de flecha y enviando un evento OnKeyPress. Esto funciona, pero quiero poder usar modificadores ( ALT + CTRL + SHIFT ). Tan pronto como sostengo un modificador y presiono una flecha, no se activan los eventos que estoy escuchando.

¿Alguien tiene alguna idea o sugerencia sobre a dónde debería ir con esto?


Dentro de su ProcessCmdKey reemplazado, ¿cómo está determinando qué tecla ha sido presionada?

El valor de keyData (el segundo parámetro) cambiará dependiendo de la tecla presionada y de cualquier tecla modificadora, por lo que, presionando la flecha izquierda, se mostrará el código 37, shift-left devolverá 65573, ctrl-left 131109 y alt-left 262181.

Puede extraer los modificadores y la tecla presionada por ANDing con los valores enum apropiados:

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 }


Volví a subir la respuesta de Tokabi , pero para comparar claves hay algunos consejos adicionales sobre .com aquí . Aquí hay algunas funciones que utilicé para ayudar a simplificar todo.

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