Как изменить события для клавиш клавиатуры (Windows Forms .NET)
Формы Windows Forms предоставляют возможность получать и изменять вводимые с клавиатуры данные. Получением клавиши называется обработка клавиши внутри метода или обработчика событий таким образом, чтобы следующие методы и события в очереди сообщений не получали значение этой клавиши. Изменением клавиши называется изменение значения клавиши таким образом, чтобы следующие методы и обработчики событий в очереди сообщений получали другое значение клавиши. В этой статье показано, как выполнять данные задачи.
Получение клавиши
В обработчике событий KeyPress установите для свойства Handled класса KeyPressEventArgs значение true
.
–или–
В обработчике событий KeyDown установите для свойства Handled класса KeyEventArgs значение true
.
Примечание.
Установка свойства Handled в обработчике событий KeyDown не препятствует возникновению событий KeyPress и KeyUp для текущей клавиши. Для этой цели используется свойство SuppressKeyPress.
В следующем примере обрабатывается событие KeyPress для получения символьных клавиш A
и a
. Эти клавиши не могут быть использованы для ввода текста в текстовом поле:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
e.Handled = true;
}
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
e.Handled = True
End If
End Sub
Изменение стандартной символьной клавиши
В обработчике событий KeyPress задайте для свойства KeyChar класса KeyPressEventArgs значение новой символьной клавиши.
В следующем примере обрабатывается событие KeyPress для изменения всех символьных клавиш A
и a
на !
:
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
{
e.KeyChar = '!';
e.Handled = false;
}
}
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs)
If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
e.KeyChar = "!"c
e.Handled = False
End If
End Sub
Изменение клавиши, не связанной с символом
Единственный способ изменения нажатий клавиш, не связанных с символами, — выполнить наследование от элемента управления и переопределить метод PreProcessMessage. После отправки входных данных Message элементу управления они обрабатываются до того, как элемент управления порождает события. Вы можете перехватить эти сообщения, чтобы изменить или заблокировать их.
В примере кода ниже показано использование свойства WParam параметра Message для изменения нажатой клавиши. Этот код обнаруживает клавишу в диапазоне от F1 до F10 и преобразует клавишу в число в диапазоне от 0 до 9 (F10 соответствует 0).
public override bool PreProcessMessage(ref Message m)
{
const int WM_KEYDOWN = 0x100;
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)m.WParam & Keys.KeyCode;
// Detect F1 through F9.
m.WParam = keyCode switch
{
Keys.F1 => (IntPtr)Keys.D1,
Keys.F2 => (IntPtr)Keys.D2,
Keys.F3 => (IntPtr)Keys.D3,
Keys.F4 => (IntPtr)Keys.D4,
Keys.F5 => (IntPtr)Keys.D5,
Keys.F6 => (IntPtr)Keys.D6,
Keys.F7 => (IntPtr)Keys.D7,
Keys.F8 => (IntPtr)Keys.D8,
Keys.F9 => (IntPtr)Keys.D9,
Keys.F10 => (IntPtr)Keys.D0,
_ => m.WParam
};
}
// Send all other messages to the base method.
return base.PreProcessMessage(ref m);
}
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean
Const WM_KEYDOWN = &H100
If m.Msg = WM_KEYDOWN Then
Dim keyCode As Keys = CType(m.WParam, Keys) And Keys.KeyCode
Select Case keyCode
Case Keys.F1 : m.WParam = CType(Keys.D1, IntPtr)
Case Keys.F2 : m.WParam = CType(Keys.D2, IntPtr)
Case Keys.F3 : m.WParam = CType(Keys.D3, IntPtr)
Case Keys.F4 : m.WParam = CType(Keys.D4, IntPtr)
Case Keys.F5 : m.WParam = CType(Keys.D5, IntPtr)
Case Keys.F6 : m.WParam = CType(Keys.D6, IntPtr)
Case Keys.F7 : m.WParam = CType(Keys.D7, IntPtr)
Case Keys.F8 : m.WParam = CType(Keys.D8, IntPtr)
Case Keys.F9 : m.WParam = CType(Keys.D9, IntPtr)
Case Keys.F10 : m.WParam = CType(Keys.D0, IntPtr)
End Select
End If
Return MyBase.PreProcessMessage(m)
End Function
См. также
.NET Desktop feedback