#c_sharp #winforms #клавиатура
День добрый, друзья! Пишу программу, в которой можно задавать горячие клавиши на действия. И столкнулся с проблемой в цифровой клавиатуре. Если нажать например на 0 (на цифровой клавиатуре), то в textbox в событии KeyDown, e.KeyCode будет иметь значение Keys.NumPad0, а если нажать на SHIFT + 0(на цифровой клавиатуре) то e.KeyCode = Keys.Insert, а e.Modifiers = Keys.None и e.Shift = false; private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.Shift && e.KeyCode == Keys.NumPad0) { MessageBox.Show("SHIFT + NumPad0"); } } Путем экспериментов выяснил, что ОС при нажатии шифта и NumPad0 преобразует его в Insert, а если быть точным, программно "отжимает" Shift и заменяет эту комбинацию на Insert. Поэтому добавил в метод KeyDown условие if (e.Modifiers == Keys.Shift) { _FlagShiftPressed = true; } а в методе KeyUp if (e.Shift == false & e.Modifiers == Keys.Shift) { _FlagShiftPressed = false; } Таким образом получилось обработать любые нажатия на цифровую клавиатуру с любым модификатором. Но после этого вылез подводный камень. При нажатии на SHIFT, отпускании и последующем нажатии на Insert(например) то получаем результат как при нажатии на SHIFT+0(на цифровой клаве). Т.е. в событии KeyUp, при отпускании Shift не сбрасывается флаг и обработка идет как будто нажата цифровая клавиатура. Если не понятно выразился, то можно посмотреть на примере задания "горячих кнопок" в свойствах ярлыка. Как можно обойти данную проблему, или может есть другие более рациональные пути решения?
Ответы
Ответ 1
Нашел решение здесь же, на stackoverflow, и пока работает без ошибок. Приведу его здесь для уменьшения степени энтропии. В моем случае проверяю сканкоды на соответствие след. кнопкам: Insert, Home, PageUp, PageDown, End, Left, Up, Down, Right. protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { switch (msg.Msg) { case WM_KEYDOWN: { int lParam = msg.LParam.ToInt32(); int scanCode = (lParam >> 16) & 0x000000ff; // extract bit 16-23 int ext = (lParam >> 24) & 0x00000001; // extract bit 24 if (ext == 1) { scanCode += 128; } if (scanCode == 210 || scanCode == 199 || scanCode == 201 || scanCode == 209 || scanCode == 200 || scanCode == 203 || scanCode == 205 || scanCode == 208 || scanCode == 207) { _FlagShiftPressed = false; } break; } } return base.ProcessCmdKey(ref msg, keyData); }
Комментариев нет:
Отправить комментарий