Михаил, я уже пишу на дотнете с момента его появления, а сейчас на 4.0 версии. Если бы были какие-то
проблемы с обработкой нажатий клавиатуры, включая модификаторы ALT, SHIFT, CONTROL, CAPS, все
функциональные клавиши F1-F12, то было бы сказано, что есть проблемы. Однако, их нет! Просто есть
программисты с кривыми руками, а есть те, кто сначала читает, а потом код пишет... Так к слову...
Поэтому ваши сомнения безосновательны.
Михаил, ниже привожу простой пример для обработки функциональных клавиш. Посмотрите на код
и увидите, как все просто:
public override bool PreProcessMessage(re f Message m)
{
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)m.WParam & Keys.KeyCode;
// Определяем нажатие F1 до F9.
switch (keyCode)
{
case Keys.F1:
case Keys.F2:
case Keys.F3:
case Keys.F4:
case Keys.F5:
case Keys.F6:
case Keys.F7:
case Keys.F8:
case Keys.F9:
MessageBox.Show("Con trol.PreProcessMessa ge: '" +
keyCode.ToString() + "' нажата.");
// Заменяем F3 на F1, так что ProcessKeyMessage будет
// получать F1 вместо F3.
if (keyCode == Keys.F3)
{
m.WParam = (IntPtr)Keys.F1;
MessageBox.Show("Con trol.PreProcessMessa ge: '" +
keyCode.ToString() + "' изменено по F1.");
}
break;
}
}
// Посылаем все остальные сообщения в базовый метод.
return base.PreProcessMessa ge(ref m);
}
Обращаю внимание на то, что системный хук сообщений WM_... идет прямо в самом дотнете.
Все, что нужно, это имплементировать IMessageFilter интерфейс и его методы в классе. И все!
Можно использовать и прямой вызов, но очень редко, когда это нужно. Например, так:
<DllImport("User32.d ll")>
private static extern short GetAsyncKeyState(Sys tem.Windows.Forms.Ke ys vKey)
вызывая функцию-обработчик из API Windows. Для всех модификаторов, есть инумератор в
дотнете, тогда имеем возможность проверки:
if ((e.Modifiers & Keys.Shift) == Keys.Shift) или
if ((e.Modifiers & Keys.Control) == Keys.Control) и т.д.
Тогда простой код будет выглядеть так:
Private Sub Button1_KeyPress(ByV al sender As Object, ByVal e As _
System.Windows.Forms .KeyPressEventArgs) Handles Button1.KeyPress
If (Control.ModifierKey s And Keys.Shift) = Keys.Shift Then
MessageBox.Show("Наж ата " & Keys.Shift)
End If
End Sub
где Control.ModifierKeys , как раз и есть инумератор всех модификаторов, т.е. коллекция.
Ну, а если хочется заняться мазохизмом, то можно использовать метод:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) переписав его под себя.
Можно будет отлавливать через API вообще все клавиши.